Subversion Repositories gelsvn

Rev

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

Rev 568 Rev 572
Line 12... Line 12...
12
#include <HMesh/curvature.h>
12
#include <HMesh/curvature.h>
13
#include <HMesh/quadric_simplify.h>
13
#include <HMesh/quadric_simplify.h>
14
#include <HMesh/mesh_optimization.h>
14
#include <HMesh/mesh_optimization.h>
15
#include <HMesh/smooth.h>
15
#include <HMesh/smooth.h>
16
 
16
 
-
 
17
#include <complex>
-
 
18
 
17
using namespace CGLA;
19
using namespace CGLA;
18
using namespace std;
20
using namespace std;
19
using namespace HMesh;
21
using namespace HMesh;
20
 
22
 
21
void shortest_edge_triangulate_face(Manifold& m, FaceID f0, VertexAttributeVector<int>& level_set_id_vertex)
23
void shortest_edge_triangulate_face(Manifold& m, FaceID f0, VertexAttributeVector<int>& level_set_id_vertex)
Line 116... Line 118...
116
        for(int i = 0; i < N ; ++i){
118
        for(int i = 0; i < N ; ++i){
117
            for(int j = 3; j < N-2; ++j){
119
            for(int j = 3; j < N-2; ++j){
118
                int jj = (j+i)%N;
120
                int jj = (j+i)%N;
119
                if(!connected(m, verts[i], verts[jj]) &&
121
                if(!connected(m, verts[i], verts[jj]) &&
120
                   (level_set_id_vertex[verts[i]] != level_set_id_vertex[verts[jj]]) &&
122
                   (level_set_id_vertex[verts[i]] != level_set_id_vertex[verts[jj]]) &&
121
                    (level_set_id_vertex[verts[(i+1)%N]] == level_set_id_vertex[verts[i]]) &&
123
                   (level_set_id_vertex[verts[(i+1)%N]] == level_set_id_vertex[verts[i]]) &&
122
                    (level_set_id_vertex[verts[(i+N-1)%N]] == level_set_id_vertex[verts[i]]) &&
124
                   (level_set_id_vertex[verts[(i+N-1)%N]] == level_set_id_vertex[verts[i]]) &&
123
                    (level_set_id_vertex[verts[(jj+1)%N]] == level_set_id_vertex[verts[jj]]) &&
125
                   (level_set_id_vertex[verts[(jj+1)%N]] == level_set_id_vertex[verts[jj]]) &&
124
                    (level_set_id_vertex[verts[(jj+N-1)%N]] == level_set_id_vertex[verts[jj]]))
126
                   (level_set_id_vertex[verts[(jj+N-1)%N]] == level_set_id_vertex[verts[jj]]))
125
                    vpairs.push_back(pair<int,int>(i, jj));
127
                    vpairs.push_back(pair<int,int>(i, jj));
126
            }
128
            }
127
        }
129
        }
128
        if(vpairs.empty()) continue;
130
        if(vpairs.empty()) continue;
129
        
131
        
Line 185... Line 187...
185
            return DBL_MAX;
187
            return DBL_MAX;
186
        return sqr_length(m.pos(w.next().vertex())-m.pos(w.opp().next().vertex()))/(1e-6+abs(fun[w.next().vertex()]-fun[w.opp().next().vertex()])) - sqr_length(m.pos(w.vertex())-m.pos(w.opp().vertex()))/(1e-6+abs(fun[w.vertex()]-fun[w.opp().vertex()]));
188
        return sqr_length(m.pos(w.next().vertex())-m.pos(w.opp().next().vertex()))/(1e-6+abs(fun[w.next().vertex()]-fun[w.opp().next().vertex()])) - sqr_length(m.pos(w.vertex())-m.pos(w.opp().vertex()))/(1e-6+abs(fun[w.vertex()]-fun[w.opp().vertex()]));
187
    }
189
    }
188
};
190
};
189
 
191
 
-
 
192
class TriangleQualityValence: public EnergyFun
-
 
193
{
-
 
194
    VertexAttributeVector<int>& idv;
-
 
195
    MinAngleEnergy mae;
-
 
196
    ValencyEnergy vae;
-
 
197
public:
-
 
198
    TriangleQualityValence(VertexAttributeVector<int>& _idv): idv(_idv), mae(-1) {}
-
 
199
    virtual double delta_energy(const Manifold& m, HalfEdgeID h) const 
-
 
200
    {
-
 
201
        HalfEdgeWalker w = m.halfedgewalker(h);
-
 
202
        if(idv[w.next().vertex()] == idv[w.opp().next().vertex()] || 
-
 
203
           idv[w.vertex()] == idv[w.opp().vertex()])
-
 
204
            return DBL_MAX;
-
 
205
        
-
 
206
        VertexID v1 = w.opp().vertex();
-
 
207
        VertexID v2 = w.vertex();
-
 
208
        VertexID vo1 = w.next().vertex();
-
 
209
        VertexID vo2 = w.opp().next().vertex();
-
 
210
        
-
 
211
        int val1  = valency(m, v1);
-
 
212
        int val2  = valency(m, v2);
-
 
213
        int valo1 = valency(m, vo1);
-
 
214
        int valo2 = valency(m, vo2);
-
 
215
        
-
 
216
        // The optimal valency is four for a boundary vertex
-
 
217
        // and six elsewhere.
-
 
218
        int t1 = boundary(m, v1) ? 4 : 6;
-
 
219
        int t2 = boundary(m, v2) ? 4 : 6;
-
 
220
        int to1 = boundary(m, vo1) ? 4 : 6;
-
 
221
        int to2 = boundary(m, vo2) ? 4 : 6;
-
 
222
        
-
 
223
        int before = 
-
 
224
        max(max(sqr(val1-t1),sqr(val2-t2)), max(sqr(valo1-to1), sqr(valo2-to2)));
-
 
225
        int after = 
-
 
226
        max(max(sqr(valo1+1-to1),sqr(val1-1-t1)), max(sqr(val2-1-t2),sqr(valo2+1-to2)));
-
 
227
        
-
 
228
        return static_cast<double>(after-before);
-
 
229
        
-
 
230
        //        return vae.delta_energy(m,h);
-
 
231
        float la = length(m.pos(w.next().vertex())-m.pos(w.opp().next().vertex()));
-
 
232
        float lb = length(m.pos(w.vertex())-m.pos(w.opp().vertex()));
-
 
233
        return la-lb;
-
 
234
        return mae.delta_energy(m,h);
-
 
235
    }
-
 
236
};
-
 
237
 
190
class TriangleQuality: public EnergyFun
238
class TriangleQuality: public EnergyFun
191
{
239
{
192
    VertexAttributeVector<int>& idv;
240
    VertexAttributeVector<int>& idv;
193
    MinAngleEnergy mae;
241
    MinAngleEnergy mae;
194
    ValencyEnergy vae;
242
    ValencyEnergy vae;
Line 198... Line 246...
198
    {
246
    {
199
        HalfEdgeWalker w = m.halfedgewalker(h);
247
        HalfEdgeWalker w = m.halfedgewalker(h);
200
        if(idv[w.next().vertex()] == idv[w.opp().next().vertex()] || 
248
        if(idv[w.next().vertex()] == idv[w.opp().next().vertex()] || 
201
           idv[w.vertex()] == idv[w.opp().vertex()])
249
           idv[w.vertex()] == idv[w.opp().vertex()])
202
            return DBL_MAX;
250
            return DBL_MAX;
203
                
-
 
204
//        VertexID v1 = w.opp().vertex();
-
 
205
//        VertexID v2 = w.vertex();
-
 
206
//        VertexID vo1 = w.next().vertex();
-
 
207
//        VertexID vo2 = w.opp().next().vertex();
-
 
208
//        
-
 
209
//        int val1  = valency(m, v1);
-
 
210
//        int val2  = valency(m, v2);
-
 
211
//        int valo1 = valency(m, vo1);
-
 
212
//        int valo2 = valency(m, vo2);
-
 
213
//        
-
 
214
//        // The optimal valency is four for a boundary vertex
-
 
215
//        // and six elsewhere.
-
 
216
//        int t1 = boundary(m, v1) ? 4 : 6;
-
 
217
//        int t2 = boundary(m, v2) ? 4 : 6;
-
 
218
//        int to1 = boundary(m, vo1) ? 4 : 6;
-
 
219
//        int to2 = boundary(m, vo2) ? 4 : 6;
-
 
220
//        
-
 
221
//        int before = 
-
 
222
//        max(max(sqr(val1-t1),sqr(val2-t2)), max(sqr(valo1-to1), sqr(valo2-to2)));
-
 
223
//        int after = 
-
 
224
//            max(max(sqr(valo1+1-to1),sqr(val1-1-t1)), max(sqr(val2-1-t2),sqr(valo2+1-to2)));
-
 
225
//        
-
 
226
//        return static_cast<double>(after-before);
-
 
227
 
-
 
228
//        return vae.delta_energy(m,h);
-
 
229
//        float la = length(m.pos(w.next().vertex())-m.pos(w.opp().next().vertex()));
-
 
230
//        float lb = length(m.pos(w.vertex())-m.pos(w.opp().vertex()));
-
 
231
//        return la-lb;
-
 
232
        return mae.delta_energy(m,h);
251
        return mae.delta_energy(m,h);
233
    }
252
    }
234
};
253
};
235
 
254
 
-
 
255
Vec3f grad(HMesh::Manifold& m, HMesh::VertexAttributeVector<double>& fun, HMesh::FaceID f)
-
 
256
{
-
 
257
    if(no_edges(m,f) != 3)
-
 
258
        return Vec3f(0.0);
-
 
259
    
-
 
260
    
-
 
261
    Vec3f n = normal(m, f);
-
 
262
    
-
 
263
    Vec3f gsum(0.0);
-
 
264
    for(HalfEdgeWalker w = m.halfedgewalker(f); !w.full_circle(); w = w.next())
-
 
265
    {
-
 
266
        Vec3f gdir = normalize(cross(n, m.pos(w.vertex()) - m.pos(w.opp().vertex())));
-
 
267
        float l = dot(m.pos(w.next().vertex())-m.pos(w.vertex()), gdir);
-
 
268
        gdir *= fun[w.next().vertex()]/l;
-
 
269
        gsum += gdir;
-
 
270
    }
-
 
271
    return gsum;
-
 
272
}
-
 
273
 
-
 
274
complex<double> complex_slerp(double t, const complex<double>& a, const complex<double>&b)
-
 
275
{
-
 
276
    double omega = (arg(a/b));
-
 
277
    cout << omega << endl;
-
 
278
    return (a*sin((1-t)*omega) + b*sin(t*omega))/sin(omega);
-
 
279
}
-
 
280
 
-
 
281
double mod_2pi(double x)
-
 
282
{
-
 
283
    return x-floor(x/(2.0 * M_PI))*2.0 * M_PI;
-
 
284
}
-
 
285
 
-
 
286
void extend_fun2(HMesh::Manifold& m, HMesh::HalfEdgeID h,
-
 
287
                 HMesh::VertexAttributeVector<double>& fun, 
-
 
288
                 HMesh::VertexAttributeVector<double>& fun2)
-
 
289
{
-
 
290
    HalfEdgeWalker w = m.halfedgewalker(h);
-
 
291
    FaceID f = w.face();
-
 
292
    Vec3f a = m.pos(w.opp().vertex());
-
 
293
    Vec3f b = m.pos(w.vertex());
-
 
294
    Vec3f c = m.pos(w.next().vertex());
-
 
295
    Vec3f g = grad(m, fun, f);
-
 
296
    Vec3f n = normal(m, f);
-
 
297
    Vec3f N = -normalize(cross(g, n));
-
 
298
    float dot_nba = dot(N,b-a);
-
 
299
    float v;
-
 
300
    if(dot_nba > 1e-5)
-
 
301
    {
-
 
302
        float t = dot(N, c-a)/dot_nba;
-
 
303
        double aval = fun2[w.opp().vertex()];
-
 
304
        double bval = fun2[w.vertex()];
-
 
305
        double val = (1-t)*aval + t*bval;
-
 
306
        v = mod_2pi(val);
-
 
307
        cout << t << " , " << v << endl; 
-
 
308
    }
-
 
309
    else
-
 
310
        v =  fun2[w.vertex()];
-
 
311
    fun2[w.next().vertex()] = v;
-
 
312
}
236
 
313
 
237
inline bool same_level(float a, float b) {return abs(a-b) < 0.00001;}
314
inline bool same_level(float a, float b) {return abs(a-b) < 0.00001;}
238
 
315
 
239
Vec3f laplacian(const Manifold& m, VertexID v)
316
Vec3f laplacian(const Manifold& m, VertexID v)
240
{
317
{
Line 268... Line 345...
268
        if(!boundary(m, *v))
345
        if(!boundary(m, *v))
269
            m.pos(*v) = pos[*v];
346
            m.pos(*v) = pos[*v];
270
    }
347
    }
271
}
348
}
272
 
349
 
273
 
-
 
274
 
-
 
275
void polarize_mesh(Manifold& m, VertexAttributeVector<float>& fun, float vmin, float vmax, const int divisions)
350
void polarize_mesh(Manifold& m, VertexAttributeVector<double>& fun, double vmin, double vmax, const int divisions, VertexAttributeVector<double>& parametrization)
276
{
351
{
-
 
352
    vmax -= 0.01 * (vmax-vmin);
277
    float interval = (vmax-vmin)/divisions;
353
    float interval = (vmax-vmin)/divisions;
278
    
354
    
279
    VertexAttributeVector<int> status(m.total_vertices(), 0);
355
    VertexAttributeVector<int> status(m.total_vertices(), 0);
280
    
356
    
281
    
357
    
282
 
-
 
283
    // ----------------------------------------
358
    // ----------------------------------------
284
    cout << "Tracing level set curves" << endl;
359
    cout << "Tracing level set curves" << endl;
285
    
360
    
286
    vector<HalfEdgeID> hidvec;
361
    vector<HalfEdgeID> hidvec;
287
    for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
362
    for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
Line 340... Line 415...
340
                    break;
415
                    break;
341
                }
416
                }
342
    }
417
    }
343
    while(did_work);
418
    while(did_work);
344
    
419
    
-
 
420
    
-
 
421
    
345
 
422
    
346
    // ----------------------------
423
    // ----------------------------
347
    cout << "Numbering the level sets" << endl;
424
    cout << "Numbering the level sets" << endl;
348
 
425
    
-
 
426
    float max_length = 0;
-
 
427
    double max_length_fun = 0;
-
 
428
    int max_length_id =-1;
-
 
429
    HalfEdgeID max_length_h;
349
    HalfEdgeAttributeVector<int> level_set_id(m.total_halfedges(), 0);
430
    HalfEdgeAttributeVector<int> level_set_id(m.total_halfedges(), 0);
350
    VertexAttributeVector<int> level_set_id_vertex(m.total_vertices(), 0);
431
    VertexAttributeVector<int> level_set_id_vertex(m.total_vertices(), 0);
351
    int no_id=1;
432
    int no_id=1;
352
    for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
433
    for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
353
    {
434
    {
354
        HalfEdgeWalker w = m.halfedgewalker(*hid);
435
        HalfEdgeWalker w = m.halfedgewalker(*hid);
355
        if(status[w.vertex()] == 1 && status[w.opp().vertex()] == 1 &&
436
        if(status[w.vertex()] == 1 && status[w.opp().vertex()] == 1 &&
356
           same_level(fun[w.vertex()], fun[w.opp().vertex()]) &&
437
           same_level(fun[w.vertex()], fun[w.opp().vertex()]) &&
357
           level_set_id[w.halfedge()] == 0)
438
           level_set_id[w.halfedge()] == 0)
358
        {
439
        {
-
 
440
            float level_set_length = 0;
359
            while(level_set_id[w.halfedge()] != no_id)
441
            while(level_set_id[w.halfedge()] != no_id)
360
            {
442
            {
-
 
443
                level_set_length += length(m,w.halfedge());
361
                level_set_id[w.halfedge()] = no_id;
444
                level_set_id[w.halfedge()] = no_id;
362
                level_set_id[w.opp().halfedge()] = no_id;
445
                level_set_id[w.opp().halfedge()] = no_id;
363
                level_set_id_vertex[w.vertex()] = no_id;
446
                level_set_id_vertex[w.vertex()] = no_id;
364
                w = w.next();
447
                w = w.next();
365
                while(status[w.vertex()] != 1 || !same_level(fun[w.vertex()], fun[w.opp().vertex()]))
448
                while(status[w.vertex()] != 1 || !same_level(fun[w.vertex()], fun[w.opp().vertex()]))
366
                    w = w.circulate_vertex_cw();
449
                    w = w.circulate_vertex_cw();
367
            }            
450
            }            
-
 
451
            if(level_set_length > max_length)
-
 
452
            {
-
 
453
                max_length = level_set_length;
-
 
454
                max_length_id = no_id;
-
 
455
                max_length_h = w.halfedge();
-
 
456
                max_length_fun = fun[w.vertex()];
-
 
457
            }
368
        ++no_id;
458
            ++no_id;
369
        }
459
        }
370
    }
460
    }
-
 
461
    cout << max_length << " " << max_length_id << endl;
371
    cout << "Number of level sets : " << (no_id-1);
462
    cout << "Number of level sets : " << (no_id-1);
372
    // ----------------------------
463
    // ----------------------------
373
    
464
    
-
 
465
    shortest_edge_triangulate(m);
-
 
466
    
-
 
467
    
-
 
468
    // -------------
-
 
469
    cout << "Parametrize level sets " << endl;
-
 
470
    
-
 
471
    queue<HalfEdgeID> hq;
-
 
472
    HalfEdgeAttributeVector<int> touched(m.active_halfedges(), 0);
-
 
473
    HalfEdgeWalker w = m.halfedgewalker(max_length_h);
-
 
474
    float param = 0;
-
 
475
    do
-
 
476
    {
-
 
477
        parametrization[w.opp().vertex()] = 2.0 * M_PI * param / max_length;
-
 
478
        param += length(m, w.halfedge());
-
 
479
        w = w.next();
-
 
480
        while(level_set_id[w.halfedge()] != max_length_id)
-
 
481
            w = w.circulate_vertex_cw();
-
 
482
        hq.push(w.halfedge());
-
 
483
        hq.push(w.opp().halfedge());
-
 
484
        touched[w.halfedge()] = 1;
-
 
485
        touched[w.opp().halfedge()] = 1;
-
 
486
    }            
-
 
487
    while(w.halfedge() != max_length_h);
-
 
488
    
-
 
489
    while(!hq.empty())
-
 
490
    {
-
 
491
        HalfEdgeID h = hq.front();
-
 
492
        hq.pop();
-
 
493
        if(!touched[w.next().halfedge()])
-
 
494
        {
-
 
495
            extend_fun2(m, h, fun, parametrization);
-
 
496
            touched[w.next().halfedge()] = 1;
-
 
497
            touched[w.prev().halfedge()] = 1;
-
 
498
            HalfEdgeWalker w = m.halfedgewalker(h);
-
 
499
            if(!touched[w.next().opp().halfedge()])
-
 
500
            {
-
 
501
                touched[w.next().opp().halfedge()] = 1;
-
 
502
                hq.push(w.next().opp().halfedge());
-
 
503
            }
-
 
504
            if(!touched[w.prev().opp().halfedge()])
-
 
505
            {
-
 
506
                touched[w.prev().opp().halfedge()] = 1;
-
 
507
                hq.push(w.prev().opp().halfedge());
-
 
508
                
-
 
509
            }
-
 
510
        }
-
 
511
    }
374
 
512
    
-
 
513
    return; 
375
 
514
    
376
    // ----------------------------
515
    // ----------------------------
377
    cout << "Remove vertices not on level set curves" << endl;
516
    cout << "Remove vertices not on level set curves" << endl;
378
 
517
    
379
    vector<VertexID> vid_vec;
518
    vector<VertexID> vid_vec;
380
    for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
519
    for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
381
        if(status[*vid]==0)
520
        if(status[*vid]==0)
382
            vid_vec.push_back(*vid);
521
            vid_vec.push_back(*vid);
383
    
522
    
Line 387... Line 526...
387
        if(f != InvalidFaceID)
526
        if(f != InvalidFaceID)
388
            shortest_edge_triangulate_face(m, f, level_set_id_vertex);
527
            shortest_edge_triangulate_face(m, f, level_set_id_vertex);
389
        else
528
        else
390
            cout << "vertex not removed " << valency(m, vid_vec[i]) << endl; 
529
            cout << "vertex not removed " << valency(m, vid_vec[i]) << endl; 
391
    }
530
    }
392
 
531
    
393
    for(FaceIDIterator fid = m.faces_begin(); fid != m.faces_end(); ++fid)
532
    for(FaceIDIterator fid = m.faces_begin(); fid != m.faces_end(); ++fid)
394
        if(no_edges(m, *fid) > 3)
533
        if(no_edges(m, *fid) > 3)
395
            shortest_edge_triangulate_face(m, *fid, level_set_id_vertex);
534
            shortest_edge_triangulate_face(m, *fid, level_set_id_vertex);
396
    
535
    
-
 
536
    
397
    VertexAttributeVector<Vec3f> recalled_positions;
537
    VertexAttributeVector<Vec3f> recalled_positions;
398
    for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
538
    for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
399
        recalled_positions[*vid] = m.pos(*vid);
539
        recalled_positions[*vid] = m.pos(*vid);
400
        
-
 
401
//    TriangleQuality tq_energy(level_set_id_vertex);
-
 
402
//    priority_queue_optimization(m, tq_energy);
-
 
403
 
-
 
404
    
540
    
-
 
541
    
-
 
542
    TriangleQuality tq_energy(level_set_id_vertex);
-
 
543
    priority_queue_optimization(m, tq_energy);
-
 
544
    
-
 
545
    
-
 
546
    
-
 
547
    //// ----------------------------
-
 
548
    cout << "smooth level set curves" << endl;
-
 
549
    
-
 
550
    
405
    for(int iter=0;iter< 100;++iter)
551
    for(int iter=0;iter< 14;++iter)
406
    {
552
    {
-
 
553
        TriangleQualityValence tqv_energy(level_set_id_vertex);
407
        //// ----------------------------
554
        TriangleQuality tq_energy(level_set_id_vertex);
408
        cout << "smooth level set curves" << endl;
555
        priority_queue_optimization(m, tqv_energy);
409
        aw_laplacian_smooth(m,0.025);
556
        priority_queue_optimization(m, tq_energy);
-
 
557
        
410
        VertexAttributeVector<Vec3f> new_pos(m.total_vertices(), Vec3f(0));
558
        VertexAttributeVector<Vec3f> new_pos(m.total_vertices(), Vec3f(0));
411
        VertexAttributeVector<float> new_pos_wsum(m.total_vertices(), 0.0);
559
        VertexAttributeVector<float> new_pos_wsum(m.total_vertices(), 0.0);
412
        for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
560
        for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
413
        {
561
        {
414
            HalfEdgeWalker w = m.halfedgewalker(*hid);
562
            HalfEdgeWalker w = m.halfedgewalker(*hid);
415
            if(level_set_id[w.halfedge()] != 0)
563
            if(level_set_id[w.halfedge()] != 0)
416
            {
564
            {
417
                float weight = 1;//(valency(m,w.opp().vertex()));
565
                float weight = 1.0;//sqr(valency(m,w.opp().vertex())-2);
418
                new_pos[w.vertex()] += weight*m.pos(w.opp().vertex());
566
                new_pos[w.vertex()] += weight*m.pos(w.opp().vertex());
419
                new_pos_wsum[w.vertex()] += weight;
567
                new_pos_wsum[w.vertex()] += weight;
420
            }
568
            }
421
        }
569
        }
422
        for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
570
        for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
423
        {
571
        {
424
            float weight = 1;//(valency(m,*vid));
572
            float weight = 1.0;//sqr(valency(m,*vid)-2);
425
            new_pos[*vid] += weight*m.pos(*vid);
573
            new_pos[*vid] += weight*m.pos(*vid);
426
            new_pos_wsum[*vid] += weight;
574
            new_pos_wsum[*vid] += weight;
427
            m.pos(*vid) = new_pos[*vid] / new_pos_wsum[*vid];
575
            m.pos(*vid) = 0.75*m.pos(*vid) + 0.25 *new_pos[*vid] / new_pos_wsum[*vid];
428
        }
576
        }
429
    }
-
 
430
 
-
 
431
        
577
        
-
 
578
        priority_queue_optimization(m, tqv_energy);
-
 
579
        priority_queue_optimization(m, tq_energy);
-
 
580
        vector<HalfEdgeID> hidvec;
-
 
581
        for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
-
 
582
        {
-
 
583
            HalfEdgeWalker w = m.halfedgewalker(*hid);
-
 
584
            if(w.halfedge() < w.opp().halfedge() && 
-
 
585
               level_set_id[w.halfedge()] != 0 &&
-
 
586
               (
-
 
587
                ((level_set_id[w.opp().halfedge()] == level_set_id[w.opp().next().halfedge()] ||
-
 
588
                  level_set_id[w.halfedge()] == level_set_id[w.next().halfedge()]) &&
-
 
589
                 valency(m, w.vertex())+valency(m,w.opp().vertex())>10) ||
-
 
590
                
-
 
591
                valency(m, w.vertex())+valency(m,w.opp().vertex())>14
-
 
592
                )
-
 
593
               )
-
 
594
                hidvec.push_back(w.halfedge());
-
 
595
        }
432
        
596
        
-
 
597
        for(int i=0;i<hidvec.size(); ++i)
-
 
598
        {
-
 
599
            HalfEdgeWalker w = m.halfedgewalker(hidvec[i]);
-
 
600
            VertexID v = m.split_edge(hidvec[i]);
433
        TriangleQuality tq_energy(level_set_id_vertex);
601
            level_set_id_vertex[v] = level_set_id[w.halfedge()];
-
 
602
            level_set_id[w.prev().halfedge()] = level_set_id[w.halfedge()];
-
 
603
            level_set_id[w.prev().opp().halfedge()] = level_set_id[w.halfedge()];
434
            priority_queue_optimization(m, tq_energy);
604
            shortest_edge_triangulate_face(m, w.face(), level_set_id_vertex);
-
 
605
            shortest_edge_triangulate_face(m, w.opp().face(), level_set_id_vertex);
-
 
606
        }
435
        
607
        
-
 
608
        priority_queue_optimization(m, tqv_energy);
436
//                vector<HalfEdgeID> hidvec;
609
        priority_queue_optimization(m, tq_energy);
-
 
610
        
437
//                for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
611
        for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
438
//                {
612
        {
439
//                    HalfEdgeWalker w = m.halfedgewalker(*hid);
613
            HalfEdgeWalker w = m.halfedgewalker(*hid);
440
//                    if(w.halfedge() < w.opp().halfedge() && 
-
 
441
//                       level_set_id[w.halfedge()] != 0 &&
614
            if(level_set_id[w.halfedge()] != 0 &&
442
//                       valency(m, w.vertex())+valency(m,w.opp().vertex())>20)
615
               !(level_set_id[w.opp().halfedge()] == level_set_id[w.opp().next().halfedge()] ||
443
//                        hidvec.push_back(w.halfedge());
616
                 level_set_id[w.halfedge()] == level_set_id[w.next().halfedge()])  &&
444
//                }
617
               valency(m, w.vertex())<5 &&
445
//                
618
               valency(m, w.opp().vertex())<5 &&
446
//                for(int i=0;i<hidvec.size(); ++i)
619
               precond_collapse_edge(m, w.halfedge()))
447
//                {
620
            {
448
//                    HalfEdgeWalker w = m.halfedgewalker(hidvec[i]);
621
                m.collapse_edge(w.halfedge(), true);
449
//                    VertexID v = m.split_edge(hidvec[i]);
622
                did_work = true;
450
//                    level_set_id_vertex[v] = level_set_id[w.halfedge()];
-
 
451
//                    level_set_id[w.prev().halfedge()] = level_set_id[w.halfedge()];
-
 
452
//                    level_set_id[w.prev().opp().halfedge()] = level_set_id[w.halfedge()];
-
 
453
//                    shortest_edge_triangulate_face(m, w.face(), level_set_id_vertex);
-
 
454
//                    shortest_edge_triangulate_face(m, w.opp().face(), level_set_id_vertex);
-
 
455
//                }
623
            }
456
//                
624
        }
457
//            priority_queue_optimization(m, tq_energy);
625
        
458
 
626
        
459
  //  }
627
    }
460
//    for(VertexIDIterator vid = m.vertices_begin(); vid != m.vertices_end(); ++vid)
-
 
461
//        m.pos(*vid) = recalled_positions[*vid];
-
 
462
 
628
    
463
  return;
629
    return;
464
 
-
 
465
    
630
    
466
    priority_queue<EdgeQElem> edge_queue;
631
    priority_queue<EdgeQElem> edge_queue;
467
    for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
632
    for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
468
    {
633
    {
469
        HalfEdgeWalker w = m.halfedgewalker(*hid);
634
        HalfEdgeWalker w = m.halfedgewalker(*hid);
Line 494... Line 659...
494
    {
659
    {
495
        HalfEdgeID h = edge_queue.top().he;
660
        HalfEdgeID h = edge_queue.top().he;
496
        edge_queue.pop();
661
        edge_queue.pop();
497
        
662
        
498
        HalfEdgeWalker w = m.halfedgewalker(h);
663
        HalfEdgeWalker w = m.halfedgewalker(h);
499
        
-
 
500
        if(level_set_id[w.next().halfedge()] == 0 ||
664
        if(no_edges(m, w.face())==3 && no_edges(m,w.opp().face())==3 &&
501
           level_set_id[w.prev().halfedge()] == 0 ||
665
           !(level_set_id[w.next().halfedge()] == level_set_id[w.opp().prev().halfedge()] ||
502
           level_set_id[w.opp().next().halfedge()] == 0 ||
666
             level_set_id[w.prev().halfedge()] == level_set_id[w.opp().next().halfedge()]))
503
           level_set_id[w.opp().prev().halfedge()] == 0)
-
 
504
            m.merge_faces(w.face(), w.halfedge());
667
            m.merge_faces(w.face(), w.halfedge());
505
    }
668
    }
506
    
669
    
507
    
670
    
508
    for(FaceIDIterator fid = m.faces_begin(); fid != m.faces_end(); ++fid)
-
 
509
        if(no_edges(m,*fid) >= 6)
671
    return;
510
            shortest_edge_split_face(m, *fid, level_set_id_vertex);
-
 
511
    
672
    
512
    for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
-
 
513
    {
673
    
514
        HalfEdgeWalker w = m.halfedgewalker(*hid);
-
 
515
        if(level_set_id[w.halfedge()] != 0 &&
674
    do{
516
           valency(m, w.vertex())==3 &&
675
        did_work = false;
517
           valency(m, w.opp().vertex())==3 &&
-
 
518
           ((level_set_id[w.next().halfedge()] == 0 &&level_set_id[w.opp().next().halfedge()] == 0) ||
-
 
519
            (level_set_id[w.prev().halfedge()] == 0 &&level_set_id[w.opp().prev().halfedge()] == 0)) &&
676
        for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
520
           precond_collapse_edge(m, w.halfedge()))
-
 
521
        {
677
        {
-
 
678
            HalfEdgeWalker w = m.halfedgewalker(*hid);
-
 
679
            
-
 
680
            if(level_set_id[w.halfedge()] != 0 && no_edges(m, w.face())==3 &&
522
            cout << "collapsing!!!" << endl;
681
               precond_collapse_edge(m, w.halfedge()))
-
 
682
            {
523
            m.collapse_edge(w.halfedge(), true);
683
                m.collapse_edge(w.halfedge(), true);
524
            did_work = true;
684
                did_work = true;
-
 
685
            }
525
        }
686
        }
526
    }
687
    }
-
 
688
    while(did_work);
527
    
689
    
528
//    bool did_work = false;
-
 
529
 
-
 
530
    return;
-
 
531
    
690
    
-
 
691
    return;
532
    
692
    
533
    
693
    
534
    int k=0;
694
    int k=0;
535
    do {
695
    do {
536
        ++k;
696
        ++k;
Line 565... Line 725...
565
                if(no_edges(m,*fid) >= 6)
725
                if(no_edges(m,*fid) >= 6)
566
                {
726
                {
567
                    shortest_edge_split_face(m, *fid, level_set_id_vertex);
727
                    shortest_edge_split_face(m, *fid, level_set_id_vertex);
568
                    did_work = true;
728
                    did_work = true;
569
                }
729
                }
570
 
730
            
571
        }
731
        }
572
    } while (did_work && k<1);
732
    } while (did_work && k<1);
573
 
733
    
574
 
734
    
575
}
735
}
576
 
736
 
577
void make_height_fun(const HMesh::Manifold& m, HMesh::VertexAttributeVector<float>& fun,
737
void make_height_fun(const HMesh::Manifold& m, HMesh::VertexAttributeVector<double>& fun,
578
                     float& vmin, float& vmax)
738
                     double& vmin, double& vmax)
579
{
739
{
580
    VertexIDIterator vid = m.vertices_begin();
740
    VertexIDIterator vid = m.vertices_begin();
581
    vmin = vmax = m.pos(*vid)[2];
741
    vmin = vmax = m.pos(*vid)[2];
582
    for(; vid != m.vertices_end(); ++vid)
742
    for(; vid != m.vertices_end(); ++vid)
583
    {
743
    {
584
        float v = m.pos(*vid)[1];
744
        double v = m.pos(*vid)[1];
585
        fun[*vid] = v;
745
        fun[*vid] = v;
586
        vmin = min(v, vmin);
746
        vmin = min(v, vmin);
587
        vmax = max(v, vmax);
747
        vmax = max(v, vmax);
588
    }
748
    }
589
}
749
}
Line 677... Line 837...
677
//    for (int i=0; i<vid_vec.size(); ++i) {
837
//    for (int i=0; i<vid_vec.size(); ++i) {
678
//        FaceID f = m.merge_one_ring(vid_vec[i]);
838
//        FaceID f = m.merge_one_ring(vid_vec[i]);
679
//    }
839
//    }
680
//    cout << "-" << endl;
840
//    cout << "-" << endl;
681
//    }    
841
//    }    
682
    // --------------------------
842
// --------------------------
683
    // Triangulate polygons by connecting only vertices on different curves.
843
// Triangulate polygons by connecting only vertices on different curves.
684
    
844
 
685
    //    shortest_edge_triangulate(m);
845
//    shortest_edge_triangulate(m);
686
    //    TriangleQuality tq_energy(level_set_id);
846
//    TriangleQuality tq_energy(level_set_id);
687
    //    priority_queue_optimization(m, tq_energy);
847
//    priority_queue_optimization(m, tq_energy);
688
    
848
 
689
    
849
 
690
    //        k=0;
850
//        k=0;
691
    //        do {
851
//        do {
692
    //            ++k;
852
//            ++k;
693
    //            did_work = false;
853
//            did_work = false;
694
    //            priority_queue<EdgeQElem> edge_queue;
854
//            priority_queue<EdgeQElem> edge_queue;
695
    //            
855
//            
696
    //            for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
856
//            for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
697
    //            {
857
//            {
698
    //                HalfEdgeWalker w = m.halfedgewalker(*hid);
858
//                HalfEdgeWalker w = m.halfedgewalker(*hid);
699
    //                if(status[w.opp().vertex()] == 0 && status[w.vertex()] == 1)
859
//                if(status[w.opp().vertex()] == 0 && status[w.vertex()] == 1)
700
    //                {
860
//                {
701
    //                    float weight = (abs(fun[w.vertex()] - fun[w.opp().vertex()]*length(m, w.halfedge())) + 1e-6);            
861
//                    float weight = (abs(fun[w.vertex()] - fun[w.opp().vertex()]*length(m, w.halfedge())) + 1e-6);            
702
    //                    edge_queue.push(EdgeQElem(weight, w.halfedge()));
862
//                    edge_queue.push(EdgeQElem(weight, w.halfedge()));
703
    //                }
863
//                }
704
    //                
864
//                
705
    //                
865
//                
706
    //                while(!edge_queue.empty())
866
//                while(!edge_queue.empty())
707
    //                {
867
//                {
708
    //                    HalfEdgeID he = edge_queue.top().he;
868
//                    HalfEdgeID he = edge_queue.top().he;
709
    //                    edge_queue.pop();
869
//                    edge_queue.pop();
710
    //                    if(m.in_use(he))
870
//                    if(m.in_use(he))
711
    //                    {
871
//                    {
712
    //                        if(precond_collapse_edge(m,he))
872
//                        if(precond_collapse_edge(m,he))
713
    //                        {
873
//                        {
714
    //                            m.collapse_edge(he);
874
//                            m.collapse_edge(he);
715
    //                            did_work = true;
875
//                            did_work = true;
716
    //                       }
876
//                       }
717
    //                    }
877
//                    }
718
    //                }
878
//                }
719
    //            } 
879
//            } 
720
    //        }while (did_work && k < 100);
880
//        }while (did_work && k < 100);
721
    //            
881
//            
722
    //            cout << "k=" << k << endl;
882
//            cout << "k=" << k << endl;
723
    //    priority_queue_optimization(m, energy);
883
//    priority_queue_optimization(m, energy);
724
    
884
 
725
 
885
 
726
//priority_queue<EdgeQElem> edge_queue;
886
//priority_queue<EdgeQElem> edge_queue;
727
//HalfEdgeAttributeVector<int> time_stamp(m.total_halfedges(), 0);
887
//HalfEdgeAttributeVector<int> time_stamp(m.total_halfedges(), 0);
728
//for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
888
//for(HalfEdgeIDIterator hid = m.halfedges_begin(); hid != m.halfedges_end(); ++hid)
729
//if(level_set_id[*hid]==0)
889
//if(level_set_id[*hid]==0)