4

我是 CGAL 的新手,我敢肯定我的问题很简单。

我正在尝试使用 CGAL 进行一些 Delaunay 三角测量。我在球体上有一个带有 N 3D 点的网格,我想使用这些点作为三角形的顶点对球体进行三角剖分。我只需要得到一个生成的三角形的顶点列表,如下所示:

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()); 

我遇到的问题是我不知道如何得到三角测量结果。我想出了如何获得 face_iterator,但我不知道从那里做什么:

    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?¿

4

2 回答 2

6

如此所述,Facet 是一对 (Cell_handle,int)。整数表示与刻面相对的单元格的索引。所以可以像这样访问刻面的点:it->first->vertex( (it->second+k)%4 )->point()k=1->3。

请注意,如果您对球体的三角剖分(即表面三角剖分)感兴趣,则只需考虑与无限单元相关的面。此外,使用凸包解决了这个问题,参见这个例子

于 2011-10-31T07:34:26.920 回答
0

如果你用谷歌搜索finite_faces_begin(),你可以获得很多CGAL 提示。

faces 迭代器将允许您以不同的方式获取基础数据。这是一个很好的例子,它来自使用 'vertex()' 函数的名为“tesis”的东西。

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());
    ...
}

祝你好运。

于 2014-08-06T04:11:40.527 回答