Changeset 5992:3fb0eb667e02


Ignore:
Timestamp:
08/28/07 23:59:26 (6 years ago)
Author:
Robert Bradshaw <robertwb@…>
Branch:
default
Message:

fix bug in Line command, IndexFaceSet?.edges()

Location:
sage/plot/plot3d
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • sage/plot/plot3d/index_face_set.pxd

    r5987 r5992  
    1414    cdef face_c* _faces 
    1515 
     16 
    1617cdef class FaceIter: 
    1718    cdef Py_ssize_t i 
    1819    cdef IndexFaceSet set 
    19      
     20 
     21cdef class EdgeIter: 
     22    cdef Py_ssize_t i, j 
     23    cdef object seen 
     24    cdef IndexFaceSet set 
    2025 
    2126cdef class VertexIter: 
  • sage/plot/plot3d/index_face_set.pyx

    r5991 r5992  
    3737include "../../ext/python_list.pxi" 
    3838include "../../ext/python_string.pxi" 
     39 
     40include "point_c.pxi" 
    3941 
    4042 
     
    239241        cdef Py_ssize_t i, j 
    240242        return [[points[self._faces[i].vertices[j]] for j from 0 <= j < self._faces[i].n] for i from 0 <= i < self.fcount] 
    241          
     243     
     244    def edges(self): 
     245        return EdgeIter(self) 
     246         
     247    def edge_list(self): 
     248        # For consistancy 
     249        return list(self.edges()) 
     250                 
    242251    def vertices(self): 
    243252        """ 
     
    397406            self.i += 1 
    398407            return face 
     408 
     409cdef class EdgeIter: 
     410    def __init__(self, face_set): 
     411        self.set = face_set 
     412        if not self.set.enclosed: 
     413            raise TypeError, "Must be closed to use the simple iterator." 
     414        self.i = 0 
     415        self.j = 0 
     416        self.seen = {} 
     417    def __iter__(self): 
     418        return self 
     419    def __next__(self): 
     420        cdef point_c P, Q 
     421        cdef face_c face = self.set._faces[self.i] 
     422        while self.i < self.set.fcount: 
     423            if self.j == face.n: 
     424                self.i += 1 
     425                self.j = 0 
     426                if self.i < self.set.fcount: 
     427                    face = self.set._faces[self.i] 
     428            else: 
     429                if self.j == 0: 
     430                    P = self.set.vs[face.vertices[face.n-1]] 
     431                else: 
     432                    P = self.set.vs[face.vertices[self.j-1]] 
     433                Q = self.set.vs[face.vertices[self.j]] 
     434                self.j += 1 
     435                if self.set.enclosed: # Every edge appears exactly twice, once in each orientation. 
     436                    if point_c_cmp(P, Q) < 0: 
     437                        return ((P.x, P.y, P.z), (Q.x, Q.y, Q.z)) 
     438                else: 
     439                    if point_c_cmp(P, Q) > 0: 
     440                        P,Q = Q,P 
     441                    edge = ((P.x, P.y, P.z), (Q.x, Q.y, Q.z)) 
     442                    if not edge in self.seen: 
     443                        self.seen[edge] = edge 
     444                        return edge 
     445        raise StopIteration 
     446 
    399447         
    400448cdef class VertexIter: 
  • sage/plot/plot3d/parametric_surface.pyx

    r5991 r5992  
    5959 
    6060cdef inline bint smash_edge(point_c* vs, face_c* f, int a, int b): 
    61     if point_c_cmp(vs[f.vertices[a]], vs[f.vertices[b]]): 
     61    if point_c_eq(vs[f.vertices[a]], vs[f.vertices[b]]): 
    6262        f.vertices[b] = f.vertices[a] 
    6363        f.n = 3 
     
    185185            first = &self._faces[j] 
    186186            last  = &self._faces[(n-1)*m+j] 
    187             if point_c_cmp(self.vs[first.vertices[0]], self.vs[last.vertices[3]]): 
     187            if point_c_eq(self.vs[first.vertices[0]], self.vs[last.vertices[3]]): 
    188188                last.vertices[3] = first.vertices[0] 
    189189            elif first.vertices[0] != first.vertices[1] or last.vertices[3] != last.vertices[2]: 
    190190                enclosed = 0 
    191             if point_c_cmp(self.vs[first.vertices[1]], self.vs[last.vertices[2]]): 
     191            if point_c_eq(self.vs[first.vertices[1]], self.vs[last.vertices[2]]): 
    192192                last.vertices[2] = first.vertices[1] 
    193193            elif first.vertices[0] != first.vertices[1] or last.vertices[3] != last.vertices[2]: 
     
    197197            first = &self._faces[i*m] 
    198198            last  = &self._faces[i*m + m-1] 
    199             if point_c_cmp(self.vs[first.vertices[0]], self.vs[last.vertices[1]]): 
     199            if point_c_eq(self.vs[first.vertices[0]], self.vs[last.vertices[1]]): 
    200200                last.vertices[1] = first.vertices[0] 
    201201            elif first.vertices[0] != first.vertices[3] or last.vertices[1] != last.vertices[2]: 
    202202                enclosed = 0 
    203             if point_c_cmp(self.vs[first.vertices[3]], self.vs[last.vertices[2]]): 
     203            if point_c_eq(self.vs[first.vertices[3]], self.vs[last.vertices[2]]): 
    204204                last.vertices[2] = first.vertices[3] 
    205205            elif first.vertices[0] != first.vertices[3] or last.vertices[1] != last.vertices[2]: 
  • sage/plot/plot3d/point_c.pxi

    r5991 r5992  
    2424    res.x, res.y, res.z = P[0], P[1], P[2] 
    2525 
    26 cdef inline bint point_c_cmp(point_c P, point_c Q): 
     26cdef inline bint point_c_eq(point_c P, point_c Q): 
    2727    return P.x == Q.x and P.y == Q.y and P.z == Q.z 
     28     
     29cdef inline int point_c_cmp(point_c P, point_c Q): 
     30    """ 
     31    Lexographic order 
     32    """ 
     33    if P.x == Q.x: 
     34        if P.y == Q.y: 
     35            if P.z == Q.z: 
     36                return 0 
     37            elif P.z < Q.z: 
     38                return -1 
     39            else: 
     40                return 1 
     41        elif P.y < Q.y: 
     42            return -1 
     43        else: 
     44            return 1 
     45    elif P.x < Q.x: 
     46        return -1 
     47    else: 
     48        return 1 
     49 
    2850     
    2951cdef inline void point_c_add(point_c* res, point_c P, point_c Q): 
  • sage/plot/plot3d/shapes.pyx

    r5991 r5992  
    191191    axis = zaxis.cross_product(diff) 
    192192    if axis == 0: 
    193         return cyl 
     193        return cyl.translate(start) 
    194194    else: 
    195195        theta = -acos(diff[2]/height) 
Note: See TracChangeset for help on using the changeset viewer.