我想使用 CGAL 标记类型SurfaceMesh
网格的最长边框。 我知道存在一个函数CGAL::Polygon_mesh_processing::longest_border
但它只给出了一个halfedge_descriptor
,文档说这是这个边界的一部分。那么如何获取这个最长边界的所有顶点或半边。
你可以使用这样的东西:
halfedge_descriptor hd = CGAL::Polygon_mesh_processing::longest_border(mesh);
halfedge_descriptor start = hd;
do
{
//store hd
hd = next(hd, mesh);
}while hd != start;
结合上述答案,以下答案打印位于最长边界上的所有顶点索引的列表(并且还保存了索引向量(。为简单起见,将忽略包含:
typedef CGAL::Simple_cartesian<double> Kernel;
typedef CGAL::Surface_mesh<Kernel::Kernel::Point_3> SurfaceMesh;
typedef boost::graph_traits<SurfaceMesh>::halfedge_descriptor halfedge_descriptor;
typedef SurfaceMesh::Vertex_index mesh_vertex_descriptor;
boost::filesystem::path in;
SurfaceMesh sm;
std::vector<int> borderVertexID;
in >> sm;
bhd = CGAL::Polygon_mesh_processing::longest_border(sm).first;
BOOST_FOREACH(mesh_vertex_descriptor ved, vertices_around_face(bhd,sm)){
std::cout << ved << std::endl;
borderVertexID.push_back(ved);
}
除了带有next()
的循环,您还可以编写
for(vertex_descriptor : CGAL::vertices_around_face(hd, mesh){
// do something
}
查看手册