CGAL: 如何从Delaunay三角剖分中获取三角形坐标

4

我是一名新手,刚接触 CGAL,我的问题可能非常简单。

我正在尝试使用 CGAL 进行 Delaunay 三角剖分。我有一个包含 N 个三维点的网格,这些点在一个球体上,我想使用这些点作为三角形的顶点来进行球面三角剖分。我只需要获取结果三角形的顶点列表,如下:

id_triangle1 vertex_1 vertex_2 vertex_3 id_triangle2 vertex_1 vertex_2 vertex_3 .......

我已经完成了如下操作来执行三角剖分:

    std::vector<Point> P; 
    for(i=0;i<NSPOINTS;i++) 
            P.push_back(Point(GRID[i].x,GRID[i].y,GRID[i].z)); 

    // building Delaunay triangulation. 
    Delaunay dt(P.begin(), P.end()); 

我的问题是我不知道如何获得三角剖分的结果。我弄清了如何获得面迭代器,但是我不知道该怎么做:

    Delaunay::Finite_faces_iterator it; 
    for (it = dt.finite_faces_begin(); it != dt.finite_faces_end(); it++){ 
            std::cout << dt.triangle(it) << std::endl; 
    } 

我不确定迭代三角形是否正确,如果是的话...一个三角形等于一个面吗?也就是说,每个迭代位置只有一个三角形吗?如何正确获取每个三角形的x、y和z?

2个回答

6
此处所述,Facet是一对(Cell_handle,int)。整数表示与Facet相反的Cell的索引。要获取Facet中点的访问权限,可以使用以下代码: it->first->vertex( (it->second+k)%4 )->point() ,其中k的值为1到3。
请注意,如果您对球面三角剖分(例如表面三角剖分)感兴趣,则只需考虑与无限单元相邻的Facet即可。此外,使用凸包算法可以解决这个问题,参见此示例

谢谢您的快速回复,但我仍然不知道如何遍历生成的三角形,以及如何获取每个三角形顶点的索引。如我之前所说,我需要像这样的东西:三角形_1 v1 v2 v3 三角形_2 v1 v3 v4 三角形_3 v2 v4 v5 ......等等。(目前,我对顶点x、y、z坐标不感兴趣,只对其索引感兴趣)再次感谢您的帮助。 - horstmann
跟进在这里:http://cgal-discuss.949826.n4.nabble.com/Help-getting-triangles-coordinates-from-Delaunay-Triangulation-td3955310.html - gsamaras

0
如果你在谷歌上搜索 finite_faces_begin(),你可以得到很多关于CGAL的提示。
面迭代器将允许您以不同的方式访问底层数据。这里有一个来自“tesis”的好例子,使用了'vertex()'函数。

http://mati-repa-repo.googlecode.com/svn/trunk/tesis/impl/HODTs/

for( Finite_faces_iterator fi = dt.finite_faces_begin(); fi != dt.finite_faces_end(); fi++){
    Point2 point0 = Point2(fi->vertex(0)->point().hx(), fi->vertex(0)->point().hy());
    Point2 point1 = Point2(fi->vertex(1)->point().hx(), fi->vertex(1)->point().hy());
    Point2 point2 = Point2(fi->vertex(2)->point().hx(), fi->vertex(2)->point().hy());
    ...
}

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接