如何在CGAL 3D三角剖分中访问刻面?

时间:2018-07-13 22:47:12

标签: c++ unity3d cgal triangulation delaunay

我正在使用CGAL来计算一组点的3D三角剖分:

typedef CGAL::Exact_predicates_inexact_constructions_kernel K;
typedef CGAL::Delaunay_triangulation_3<K>   CGALTriangulation;
typedef CGALTriangulation::Point            Point;

// Construction from a list of points
std::list<Point> points;
points.push_front(Point(0, 0, 0));
points.push_front(Point(2, 0, 0));
points.push_front(Point(0, 2, 0));
points.push_front(Point(2, 2, 0));
points.push_front(Point(1, 1, 1));

// Perform triangulation
CGALTriangulation T(points.begin(), points.end());

访问三角形(构面)

我需要在Unity中为此创建一个网格,所以我使用CGAL,因为它有很多算法可以解决这个复杂的问题。问题在于,在API中很难找到一种方法来访问构成三角剖分的不同三角形(及其顶点),而我还没有找到一种方法:((

注意请注意,仅访问顶点对我来说还不够:

for (CGALTriangulation::Finite_vertices_iterator it = T.finite_vertices_begin(); 
    it != T.finite_vertices_end(); 
    it++) 
{
    CGALTriangulation::Triangulation_data_structure::Vertex v = *it;
    // Do something with the vertex
}

因为我没有获得有关每个顶点属于哪个小平面(三角形)的任何信息。而三角形正是我所需要的!

如何访问三角剖分的三角形(构面)?如何从各个方面提取顶点?

1 个答案:

答案 0 :(得分:2)

我不确切知道您可以实现什么。 3D Delaunay三角剖分是将点的凸包分解为四面体。无论如何,如果要访问三角剖分的面,请使用Finite_facets_iterator。

类似的东西:

for (CGALTriangulation::Finite_facets_iterator it = T.finite_facets_begin(); 
    it != T.finite_facets_end(); 
    it++) 
{
    std::pair<CGALTriangulation::Cell_handle, int> facet = *it;
    CGALTriangulation::Vertex_handle v1 = facet.first->vertex( (facet.second+1)%3 );
    CGALTriangulation::Vertex_handle v2 = facet.first->vertex( (facet.second+2)%3 );
    CGALTriangulation::Vertex_handle v3 = facet.first->vertex( (facet.second+3)%3 );
}

如果您对曲面网格感兴趣,则可能需要查看诸如Poisson surface reconstructionAdvancing Front Reconstruction之类的重建算法。