Subversion Repositories gelsvn

Rev

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

Rev 595 Rev 600
Line 2... Line 2...
2
 * This file is part of GEL, http://www.imm.dtu.dk/GEL
2
 * This file is part of GEL, http://www.imm.dtu.dk/GEL
3
 * Copyright (C) the authors and DTU Informatics
3
 * Copyright (C) the authors and DTU Informatics
4
 * For license and list of authors, see ../../doc/intro.pdf
4
 * For license and list of authors, see ../../doc/intro.pdf
5
 * ----------------------------------------------------------------------- */
5
 * ----------------------------------------------------------------------- */
6
 
6
 
7
#include "caps_and_needles.h"
7
#include "cleanup.h"
8
 
8
 
9
#include <CGLA/Vec3f.h>
9
#include <CGLA/Vec3f.h>
10
#include <CGLA/Vec3d.h>
10
#include <CGLA/Vec3d.h>
11
#include <Geometry/QEM.h>
11
#include <Geometry/QEM.h>
-
 
12
#include <Geometry/KDTree.h>
12
 
13
 
13
#include "Manifold.h"
14
#include "Manifold.h"
14
 
15
 
15
namespace HMesh
16
namespace HMesh
16
{
17
{
Line 164... Line 165...
164
                }
165
                }
165
            }
166
            }
166
        }
167
        }
167
        while(did_work);
168
        while(did_work);
168
    }
169
    }
-
 
170
    
-
 
171
    int stitch_mesh(Manifold& m)
-
 
172
    {
-
 
173
        KDTree<Vec3d, VertexID> vtree;
-
 
174
        
-
 
175
        for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
-
 
176
            if(boundary(m, *vid))
-
 
177
                vtree.insert(m.pos(*vid), *vid);
-
 
178
        vtree.build();
-
 
179
        
-
 
180
        VertexAttributeVector<int> cluster_id(m.allocated_vertices(),-1);
-
 
181
        vector<vector<HalfEdgeID> > clustered_halfedges;
-
 
182
        
-
 
183
        int cluster_ctr=0;
-
 
184
        for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
-
 
185
            if(boundary(m, *vid) && cluster_id[*vid] == -1)
-
 
186
            {
-
 
187
                vector<Vec3d> keys;
-
 
188
                vector<VertexID> vals;
-
 
189
                int n = vtree.in_sphere(m.pos(*vid), 1e-5, keys, vals);
-
 
190
                
-
 
191
                vector<HalfEdgeID> boundary_edges;
-
 
192
                for(int i=0;i<n;++i)
-
 
193
                {
-
 
194
                    cluster_id[vals[i]] = cluster_ctr;
-
 
195
                    Walker w = m.walker(vals[i]);
-
 
196
                    boundary_edges.push_back(w.halfedge());
-
 
197
                }
-
 
198
                clustered_halfedges.push_back(boundary_edges);
-
 
199
                ++cluster_ctr;
-
 
200
            }
-
 
201
        
-
 
202
        int unstitched=0;
-
 
203
        for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
-
 
204
        {
-
 
205
            HalfEdgeID h0 = *hid;
-
 
206
            Walker w = m.walker(h0);
-
 
207
            if(w.face() == InvalidFaceID)
-
 
208
            {
-
 
209
                VertexID v0 = w.opp().vertex();
-
 
210
                VertexID v1 = w.vertex();
-
 
211
                
-
 
212
                int cid = cluster_id[v1];
-
 
213
                vector<HalfEdgeID>& stitch_candidates = clustered_halfedges[cid];
-
 
214
                int i=0;
-
 
215
                for(;i<stitch_candidates.size(); ++i)
-
 
216
                {
-
 
217
                    HalfEdgeID h1 = stitch_candidates[i];
-
 
218
                    if(m.in_use(h1))
-
 
219
                    {
-
 
220
                        Walker w = m.walker(h1);
-
 
221
                        if(cluster_id[w.vertex()] == cluster_id[v0])
-
 
222
                            if(m.stitch_boundary_edges(h0,h1))
-
 
223
                                break;
-
 
224
                    }
-
 
225
                    
-
 
226
                }
-
 
227
                if(i == stitch_candidates.size())
-
 
228
                    ++unstitched;
-
 
229
            }
-
 
230
        }
-
 
231
        return unstitched;    
-
 
232
    }
-
 
233
    
-
 
234
    
-
 
235
    void stitch_more(Manifold& mani)
-
 
236
    {
-
 
237
        int unstitched, iter;
-
 
238
        for(iter=0;iter<2;++iter)
-
 
239
        {
-
 
240
            unstitched = stitch_mesh(mani);
-
 
241
            if(unstitched == 0)
-
 
242
                break;
-
 
243
            
-
 
244
            vector<HalfEdgeID> hvec;
-
 
245
            for(HalfEdgeIDIterator h = mani.halfedges_begin(); h != mani.halfedges_end();++h)
-
 
246
                if(mani.walker(*h).face() == InvalidFaceID)
-
 
247
                    hvec.push_back(*h);
-
 
248
            for(int i=0;i<hvec.size(); ++i)
-
 
249
                mani.split_edge(hvec[i]);
-
 
250
            
-
 
251
        }
-
 
252
    }
-
 
253
    
-
 
254
    
-
 
255
    void close_holes(Manifold& m)
-
 
256
    {
-
 
257
        for(HalfEdgeIDIterator h =  m.halfedges_begin(); h != m.halfedges_end(); ++h){
-
 
258
            m.close_hole(*h);
-
 
259
        }
-
 
260
    }
-
 
261
    
169
}
262
}
170
 
263