Subversion Repositories gelsvn

Rev

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

Rev 630 Rev 631
Line 402... Line 402...
402
        //create two necessary halfedges, and update connectivity
402
        //create two necessary halfedges, and update connectivity
403
        HalfEdgeID hn = kernel.add_halfedge();
403
        HalfEdgeID hn = kernel.add_halfedge();
404
        HalfEdgeID hno = kernel.add_halfedge();
404
        HalfEdgeID hno = kernel.add_halfedge();
405
		
405
		
406
        kernel.set_out(vo, hn);
406
        kernel.set_out(vo, hn);
407
        kernel.set_out(v, ho);
407
        kernel.set_out(v, hno);
408
		
408
		
-
 
409
        glue(h, hno);
409
        glue(hn, hno);
410
        glue(hn, ho);
410
		
411
		
411
        link(kernel.prev(h), hn);
412
        link(kernel.prev(h), hn);
412
        link(hn, h);
413
        link(hn, h);
413
		
-
 
414
        kernel.set_vert(hn, vn);
414
        kernel.set_vert(hn, vn);
415
		
415
		
416
        link(hno, kernel.next(ho));
416
        link(kernel.prev(ho), hno);
417
        link(ho, hno);
417
        link(hno, ho);
418
		
-
 
419
        kernel.set_vert(hno, vo);
418
        kernel.set_vert(hno, vn);
420
        kernel.set_vert(ho, vn);
-
 
421
		
419
		
422
        // update faces in case of non boundary edge
420
        // update faces in case of non boundary edge
423
        if(kernel.face(h) != InvalidFaceID)
421
        if(kernel.face(h) != InvalidFaceID)
424
            kernel.set_last(kernel.face(h), hn);
422
            kernel.set_last(kernel.face(h), hn);
425
		
423
		
Line 1366... Line 1364...
1366
        size_t N = one_ring.size();
1364
        size_t N = one_ring.size();
1367
        if(N<2)
1365
        if(N<2)
1368
            return Manifold::Vec(0);
1366
            return Manifold::Vec(0);
1369
        
1367
        
1370
        size_t N_count = N;
1368
        size_t N_count = N;
-
 
1369
        size_t N_start = 0;
1371
        if(boundary(m, v))
1370
        if(boundary(m, v))
1372
            N_count -= 1;
1371
            N_start = 1;
1373
        
1372
        
1374
        // sum up the normals of each face surrounding the vertex
1373
        // sum up the normals of each face surrounding the vertex
1375
        for(size_t i = 0; i < N_count; ++i){
1374
        for(size_t i = N_start; i < N_count; ++i){
1376
            Manifold::Vec e0 = one_ring[i];
1375
            Manifold::Vec e0 = one_ring[i];
1377
            Manifold::Vec e1 = one_ring[(i+1) % N];
1376
            Manifold::Vec e1 = one_ring[(i+1) % N];
1378
            
1377
            
1379
            Manifold::Vec n_part = normalize(cross(e0, e1));
1378
            Manifold::Vec n_part = normalize(cross(e0, e1));
1380
            n += n_part * acos(max(-1.0, min(1.0, dot(e0, e1))));
1379
            n += n_part * acos(max(-1.0, min(1.0, dot(e0, e1))));
Line 1423... Line 1422...
1423
            norm /= sqrt(l);
1422
            norm /= sqrt(l);
1424
        return norm;
1423
        return norm;
1425
    }
1424
    }
1426
    
1425
    
1427
    
1426
    
1428
    float area(const Manifold& m, FaceID f)
1427
    float area(const Manifold& m, FaceID fid)
1429
    {
1428
    {
1430
        // Get all projected vertices
1429
        // Get all projected vertices
1431
        vector<Manifold::Vec> vertices;
1430
        vector<Manifold::Vec> vertices;
1432
        Walker w = m.walker(f);
1431
        Walker w = m.walker(fid);
1433
        for(; !w.full_circle(); w = w.circulate_face_ccw())
1432
        for(; !w.full_circle(); w = w.circulate_face_ccw())
1434
            vertices.push_back(m.pos(w.vertex()));
1433
            vertices.push_back(m.pos(w.vertex()));
1435
        float area = 0;
1434
        float area = 0;
1436
        int k = w.no_steps();
1435
        size_t N = vertices.size();
1437
        Manifold::Vec n = normal(m,f);
1436
        Manifold::Vec norm = normal(m,fid);
1438
        for(int i = 0; i < k; ++i)
1437
        for(int i = 1; i < N-1; ++i)
1439
        {
-
 
1440
            Manifold::Vec A = cross(vertices[i], vertices[(i+1 )%k]);
1438
            area += 0.5 * dot(norm,cross(vertices[i]-vertices[0], vertices[(i+1 )]-vertices[0]));
1441
            float s = sign(dot(n, A));
-
 
1442
            area += 0.5 * s * length(A);
-
 
1443
        }
-
 
1444
        return abs(area);
1439
        return area;
1445
    }
1440
    }
1446
    
1441
    
1447
    Manifold::Vec centre(const Manifold& m, FaceID f)
1442
    Manifold::Vec centre(const Manifold& m, FaceID f)
1448
    {
1443
    {
1449
        Manifold::Vec c(0);
1444
        Manifold::Vec c(0);