如何在dD三角剖分中访问与凸包面有关的信息?

时间:2018-07-24 15:27:47

标签: cgal triangulation convex-hull

我正在重写使用不推荐使用的类CGAL :: Convex_hull_d的代码。我需要动态计算一组点的凸包,然后访问一个点和每个小平面的法线。

遍历通过三角剖分获得的凸包的小平面的方式在文档中非常清楚,问题是访问与小平面相关的信息旁边。

对于三维情况,我使用了类CGAL :: Delaunay_triangulation_3。在三角剖分中插入点(称为T)后,可以使用CGAL :: Surface_mesh类和函数CGAL :: convex_hull_3_to_face_graph获得凸包。接下来,我们可以使用构面迭代器遍历构面,然后使用下一个顶点迭代器访问构面的顶点。还可以使用函数CGAL :: Polygon_mesh_processing :: compute_face_normal直接访问小平面的法线。以下代码部分对此进行了描述。

Surface_mesh chull;

CGAL::convex_hull_3_to_face_graph(T,chull);

Surface_mesh::Face_range mesFaces = chull.faces();

Surface_mesh::Face_range::iterator debut,fin;

CGAL::Vertex_around_face_iterator<Surface_mesh> vbegin,vend;

debut = mesFaces.begin();

fin = mesFaces.end();

while(debut != fin) {

Vector_3 p = CGAL::Polygon_mesh::compute_face_normal(*debut,chull);

std::cout << "Normal to the facet: (" << p[0] << "," << p[1] << "," << p[2] << ")" << std:endl;

boost::tie(vbegin,vend) = vertices_around_face(chull.halfedge(*debut),chull);

Point_3 po = chull.point(*vbegin);

std::cout << "One point of the facet: (" << po[0] << "," << po[1] << "," << po[2] << ")" << std:endl;

debut++;

}

但是,类CGAL :: Delaunay_Triangulation_3和CGAL :: Surface_mesh类不能用于计算具有4个维度的一组点的凸包。因此,我考虑了(推荐)使用dD Triangulation(特别是CGAL :: Triangulation类)。遍历凸包的各个面不是问题,因为在文献中给出了两个完整的示例。下面是第一个。

{ int i=0;

typedef Triangulation::Full_cell_iterator Full_cell_iterator;

typedef Triangulation::Facet Facet;

for( Full_cell_iterator cit = t.full_cells_begin();cit != t.full_cells_end(); ++cit )

{

if( ! t.is_infinite(cit) )

continue;

Facet ft(cit, cit->index(t.infinite_vertex()));

++i;// |ft| is a facet of the convex hull

}

std::cout << "There are " << i << " facets on the convex hull."<< std::endl;

}

此处,构面ft已创建但未使用,构面仅计算在内。在文档中,我没有找到访问与构面有关的任何信息的方法。我的需求与三维案例相同。

0 个答案:

没有答案