我正在重写使用不推荐使用的类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已创建但未使用,构面仅计算在内。在文档中,我没有找到访问与构面有关的任何信息的方法。我的需求与三维案例相同。