2016-03-08 235 views
0

我目前正在使用CGAL進行樹生成應用,這是我第一次。CGAL Lib拉伸多邊形

這將是最容易和/或最好的方式做面部擠壓?新點的計算已經完成。

CGAL是一個巨大的庫,所以可能有更好更強大的方法。

請看看當前代碼(考慮註釋):

void TreeGenerator::extrude(Face_handle face, float value) 
{ 
    CGAL_precondition(m_mesh.is_valid()); 

    //calculate face normal vector direction 
    Halfedge_handle halfEdge1 = face->halfedge(); 
    Halfedge_handle halfEdge2 = halfEdge1->next(); 
    Halfedge_handle halfEdge3 = halfEdge2->next(); 
    Halfedge_handle halfEdge4 = halfEdge3->next(); 

    //vectors from v1 to v2 and from v2 to v3 -> vectors lying on the face 
    Vector3 v1(halfEdge1->vertex()->point(), halfEdge2->vertex()->point()); 
    Vector3 v2(halfEdge2->vertex()->point(), halfEdge3->vertex()->point()); 

    Vector3 normal_vector = cross_product(v1, v2); 

    //HINT: This can be cpu time consuming -> can we remove the sqrt() ? 
    normal_vector = (normal_vector/sqrt(normal_vector.squared_length())) * value; 

    std::cout << "Normal Vector: " << normal_vector << std::endl; 

    Point point1 = halfEdge1->vertex()->point() + normal_vector; 
    Point point2 = halfEdge2->vertex()->point() + normal_vector; 
    Point point3 = halfEdge3->vertex()->point() + normal_vector; 
    Point point4 = halfEdge4->vertex()->point() + normal_vector; 

    std::cout << "Point1: " << point1 << std::endl; 
    std::cout << "Point2: " << point2 << std::endl; 
    std::cout << "Point3: " << point3 << std::endl; 
    std::cout << "Point4: " << point4 << std::endl; 

    //test space -> try to use a Polyhedron_incremnt_builder_3 
    //http://doc.cgal.org/latest/Polyhedron/classCGAL_1_1Polyhedron__incremental__builder__3.html 

    //I want to do the extrude code here but what would be the best way? 

    CGAL_postcondition(m_mesh.is_valid()); 
} 

這將是真棒如果有人能指點正確的方法或者給我一個想法。

THX和再見 達裏安

回答

0

我差點忘了回答我的問題。

我通過生成一個新的多維數據集來解決這個問題。 將頂點移動到正確位置,並使用cgal方法join_loop()將新立方體連接到當前網格。

代碼:

Face_handle TreeGenerator::extrude(Face_handle face, float value) 
{ 

CGAL_precondition(m_mesh.is_valid()); 

//calculate face normal vector direction 
Halfedge_handle halfEdge1 = face->halfedge(); 
Halfedge_handle halfEdge2 = halfEdge1->next(); 
Halfedge_handle halfEdge3 = halfEdge2->next(); 
Halfedge_handle halfEdge4 = halfEdge3->next(); 

Vector3 normal_vector = getNormalVector(face, value); 

std::cout << "Normal Vector: " << normal_vector << std::endl; 

Point point1 = halfEdge1->vertex()->point() + normal_vector; 
Point point2 = halfEdge2->vertex()->point() + normal_vector; 
Point point3 = halfEdge3->vertex()->point() + normal_vector; 
Point point4 = halfEdge4->vertex()->point() + normal_vector; 

Face_handle newCubeFace = make_cube_3(m_mesh, 1.0f); 
Face_handle newOppositeFace = newCubeFace->halfedge()->opposite()->next()->next()->opposite()->face(); 

//edges to the top points 
Halfedge_handle newHalfEdge1 = newCubeFace->halfedge(); 
Halfedge_handle newHalfEdge2 = newHalfEdge1->next(); 
Halfedge_handle newHalfEdge3 = newHalfEdge2->next(); 
Halfedge_handle newHalfEdge4 = newHalfEdge3->next(); 

//edges to the bottom points 
Halfedge_handle newHalfEdgeBottom1 = newHalfEdge2->opposite()->next(); 
Halfedge_handle newHalfEdgeBottom2 = newHalfEdge3->opposite()->next(); 
Halfedge_handle newHalfEdgeBottom3 = newHalfEdge4->opposite()->next(); 
Halfedge_handle newHalfEdgeBottom4 = newHalfEdge1->opposite()->next(); 

//set new positions 
newHalfEdge1->vertex()->point() = point1; 
newHalfEdge2->vertex()->point() = point2; 
newHalfEdge3->vertex()->point() = point3; 
newHalfEdge4->vertex()->point() = point4; 

newHalfEdgeBottom1->vertex()->point() = halfEdge1->vertex()->point(); 
newHalfEdgeBottom2->vertex()->point() = halfEdge2->vertex()->point(); 
newHalfEdgeBottom3->vertex()->point() = halfEdge3->vertex()->point(); 
newHalfEdgeBottom4->vertex()->point() = halfEdge4->vertex()->point(); 

m_mesh.join_loop(halfEdge1, newOppositeFace->halfedge()); 

CGAL_postcondition(m_mesh.is_valid()); 

return newCubeFace; 
} 

也許它可以幫助別人。

Thx and bye Darian