如何在CGAL Dd Delaunay三角剖分中修改(移动)顶点坐标
CGAL Dd Delaunay三角剖分顶点坐标修改方案
CGAL默认将顶点坐标设为只读,是为了内部自动维护Delaunay三角剖分的合法性,你明确不需要保留合法性、仅需保留原有拓扑结构的场景下,有两种简便实现方式:
方案1:const_cast强制修改(最小改动,优先推荐)
直接对point()返回的const引用做常量属性移除,即可直接修改坐标,原有三角剖分的拓扑结构、点和胞腔的映射关系完全不会改变:
// 遍历所有顶点修改坐标 for(auto vit = tri.vertices_begin(); vit != tri.vertices_end(); ++vit) { // 移除返回点的const属性,安全前提是你后续不调用依赖Delaunay合法性的库接口 auto& mutable_pt = const_cast<typename Triangulation::Point&>(vit->point()); for(int d = 0; d < dim; ++d) { mutable_pt[d] = 新的坐标值; } }
注意:该操作仅会修改顶点坐标,不会触发任何拓扑重构,完全符合你的需求。仅需注意后续不要调用CGAL中依赖Delaunay性质的接口(比如自动邻域查询、点定位等),否则会出现未定义行为,自行读取拓扑结构、使用修改后的坐标计算完全不受影响。
方案2:自定义可写点类型(规范方案,适合长期维护场景)
如果不想用强制类型转换,也可以在三角剖分定义阶段自定义支持可写坐标的点类型和顶点特性,后续直接原生支持坐标修改:
// 自定义可写点类型,继承CGAL原生点类型,公开可写的坐标访问接口 struct Mutable_point_d : public CGAL::Point_d<你的内核类型> { using CGAL::Point_d<你的内核类型>::Point_d; 你的数值类型& operator[](int i) { return const_cast<你的数值类型&>(CGAL::Point_d<你的内核类型>::operator[](i)); } }; // 自定义顶点特性,指定使用自定义可写点 struct Mutable_vertex_traits : public CGAL::Triangulation_vertex_default_traits_d<你的内核类型> { typedef Mutable_point_d Point; }; // 定义三角剖分时传入自定义顶点特性 typedef CGAL::Delaunay_triangulation_d<你的内核类型, Mutable_vertex_traits> Triangulation;
定义完成后,你最开始写的vertex->point()[dimension] = new_coordinate_value就可以直接正常运行,无需额外转换。
这种方案的优势是符合CGAL的设计规范,即使后续需要调用部分CGAL接口,兼容性也更好,比你提到的额外用data成员存坐标引用的方案更简洁,不需要单独维护额外的坐标变量。
内容的提问来源于stack exchange,提问作者Wave and Matter
相关产品推荐
相关产品推荐

