我在CGAL中有一个SurfaceMesh:
https://doc.cgal.org/latest/Surface_mesh/index.html
我了解如何遍历每个面孔,如示例所示:
typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef Kernel::Point_3 Point;
typedef CGAL::Surface_mesh<Point> Surface_mesh;
BOOST_FOREACH(boost::graph_traits<Surface_mesh>::face_descriptor fit, faces(mesh)){
//do something here
}
在这里,网格是一个Surface_mesh。 我完全不清楚的是face_descriptor是什么,以及如何使用它。 当一个人有face_descriptor时,如何访问人脸的半边和顶点? 特别是,如何迭代半边的所有顶点,并获取它们的坐标?
Boost Graph Library 有一个定义 vertex_descriptor
和 edge_descriptor
的概念Graph
。它们是图形元素的标识符。在CGAL中,我们将其扩展到具有面和半边的图形。 该概念FaceGraph
解释了您可以使用face_descriptor
做什么。从此页面,您可以通过Refines:转到概念HalfedgeGraph
,它告诉您可以使用其他描述符做什么。
这些链接指向即将推出的 CGAL 版本的在线手册,我们在其中改进了有关描述符的文档 - 因此您并不孤单。
解决方案是,对于每个面,遍历面周围的顶点。
这就是以下代码的作用:
typedef CGAL::Surface_mesh<Point> Mesh;
typedef CGAL_Mesh::Face_index face_descriptor;
int i=0;
BOOST_FOREACH(face_descriptor f, faces(mesh)){
int j=0;
CGAL::Vertex_around_face_iterator<Mesh> vbegin, vend;
for(boost::tie(vbegin, vend) = vertices_around_face(mesh.halfedge(f), mesh);
vbegin != vend;
++vbegin){
j++;
std::cout << "jth index of ith face: "<< *vbegin << std::endl;
}
i++;
}