如何获取CGAL 6.0 Surface Mesh的边顶点索引对列表?
在CGAL 6.0 Surface Mesh中直接获取所有边的顶点索引对
你可以直接遍历Surface Mesh的所有边,无需从面提取后去重,具体实现如下:
核心思路
直接迭代网格的edges()集合,对每条边获取其关联的两个顶点索引,组成(id1, id2)形式的配对即可。如果需要无向边的唯一表示,可额外处理保证索引顺序。
代码示例
#include <CGAL/Surface_mesh.h> #include <vector> #include <utility> // 定义Surface Mesh类型 typedef CGAL::Surface_mesh<CGAL::Point_3<CGAL::Simple_cartesian<double>>> Surface_mesh; typedef Surface_mesh::Vertex_index Vertex_index; typedef Surface_mesh::Edge_index Edge_index; int main() { Surface_mesh m; // ... 填充网格数据(顶点、面等) ... std::vector<std::pair<unsigned int, unsigned int>> edge_vertex_pairs; // 遍历所有边 for (Edge_index e : m.edges()) { // 获取边对应的半边,进而得到两个顶点 auto he = m.halfedge(e, 0); Vertex_index v1 = m.source(he); Vertex_index v2 = m.target(he); // 存储顶点索引对 edge_vertex_pairs.emplace_back(v1.idx(), v2.idx()); // 可选:如果需要无向边的唯一存储,过滤掉反向边 // if (v1.idx() < v2.idx()) { // edge_vertex_pairs.emplace_back(v1.idx(), v2.idx()); // } } // edge_vertex_pairs 即为目标列表 return 0; }
关键说明
m.edges()会返回网格中所有边的索引集合,直接遍历即可覆盖所有边- 每条边对应两个半边,通过
m.halfedge(e, 0)取其中一个半边,再用source()和target()获取顶点 idx()方法返回顶点在网格中的整数索引,符合你需要的id形式- 若不需要区分边的方向,添加
v1.idx() < v2.idx()的判断,可避免存储同一条边的双向表示
内容的提问来源于stack exchange,提问作者Satabol
相关产品推荐
相关产品推荐

