Subversion Repositories gelsvn

Rev

Rev 595 | Rev 601 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 595 Rev 600
Line 108... Line 108...
108
        FaceID fid = *faces_end();
108
        FaceID fid = *faces_end();
109
        build(points.size(), reinterpret_cast<double*>(&points[0]), 1, &F, &indices[0]);
109
        build(points.size(), reinterpret_cast<double*>(&points[0]), 1, &F, &indices[0]);
110
        return fid;
110
        return fid;
111
    }
111
    }
112
    
112
    
113
//    bool remove_face(FaceID fid);
113
    bool Manifold::remove_face(FaceID fid)
-
 
114
    {
-
 
115
        if(!in_use(fid))
-
 
116
            return false;
-
 
117
        
-
 
118
        HalfEdgeID he = kernel.last(fid);
-
 
119
        HalfEdgeID last = he;
-
 
120
        
-
 
121
        vector<HalfEdgeID> halfedges;
-
 
122
        do
-
 
123
        {
-
 
124
            halfedges.push_back(he);
-
 
125
            kernel.set_face(he, InvalidFaceID);
-
 
126
            he = kernel.next(he);
-
 
127
        }
-
 
128
        while(he != last);
-
 
129
        
-
 
130
        vector<HalfEdgeID> halfedges_garbage;
-
 
131
        vector<VertexID> vertices_garbage;
-
 
132
        for(int i=0;i<halfedges.size(); ++i)
-
 
133
        {
-
 
134
            HalfEdgeID h = halfedges[i];
-
 
135
            HalfEdgeID hopp = kernel.opp(h);
-
 
136
            if(kernel.face(hopp) == InvalidFaceID)
-
 
137
            {
-
 
138
                halfedges_garbage.push_back(h);
-
 
139
                VertexID v0 = kernel.vert(hopp);
-
 
140
                if(valency(*this, v0) <= 2 )
-
 
141
                    vertices_garbage.push_back(v0);
-
 
142
                else {
-
 
143
                    link(kernel.prev(h), kernel.next(hopp));
-
 
144
                    kernel.set_out(v0, kernel.opp(kernel.prev(h)));
-
 
145
                }
-
 
146
                VertexID v1 = kernel.vert(h);
-
 
147
                if(valency(*this, v1)>2)
-
 
148
                {
-
 
149
                    link(kernel.prev(hopp),kernel.next(h));
-
 
150
                    kernel.set_out(v1, kernel.opp(kernel.prev(hopp)));
-
 
151
                }
-
 
152
                
-
 
153
            }
-
 
154
        }
-
 
155
        for(int i=0;i<halfedges_garbage.size();++i){
-
 
156
            kernel.remove_halfedge(kernel.opp(halfedges_garbage[i]));
-
 
157
            kernel.remove_halfedge(halfedges_garbage[i]);
-
 
158
        }
-
 
159
        for(int i=0;i<vertices_garbage.size(); ++i)
-
 
160
            kernel.remove_vertex(vertices_garbage[i]);
-
 
161
        
-
 
162
        kernel.remove_face(fid);
-
 
163
        return true;
-
 
164
    }
114
//    
165
    
-
 
166
 
115
//    bool remove_edge(HalfEdgeID hid);
167
    bool Manifold::remove_edge(HalfEdgeID hid)
116
//    
168
    {
-
 
169
        if(!in_use(hid))
-
 
170
            return false;
-
 
171
        
-
 
172
        FaceID f0 = kernel.face(hid);
-
 
173
        FaceID f1 = kernel.face(kernel.opp(hid));
-
 
174
        
-
 
175
        remove_face(f0);
117
//    bool remove_vertex(VertexID vid);
176
        remove_face(f1);
-
 
177
 
-
 
178
        return true;
-
 
179
    }
118
 
180
 
119
    
181
    
-
 
182
    
-
 
183
    bool Manifold::remove_vertex(VertexID vid)
-
 
184
    {
-
 
185
        if(!in_use(vid))
-
 
186
            return false;
-
 
187
        
-
 
188
        Walker w = Manifold::walker(vid);
-
 
189
    
-
 
190
        vector<FaceID> faces;
-
 
191
        
-
 
192
        for(; !w.full_circle(); w = w.circulate_vertex_ccw())
-
 
193
            faces.push_back(w.face());
-
 
194
        
-
 
195
        for(int i=0;i<faces.size();++i)
-
 
196
            remove_face(faces[i]);
-
 
197
            
-
 
198
        return true;
-
 
199
    }
-
 
200
 
-
 
201
 
120
	
202
	
121
    void Manifold::collapse_edge(HalfEdgeID h, bool avg_vertices)
203
    void Manifold::collapse_edge(HalfEdgeID h, bool avg_vertices)
122
    {
204
    {
123
        HalfEdgeID ho = kernel.opp(h);
205
        HalfEdgeID ho = kernel.opp(h);
124
        VertexID hv = kernel.vert(h);
206
        VertexID hv = kernel.vert(h);