在CGAL中三角化面时如何保留自定义数据?
解决CGAL中网格操作时自定义面数据的复制问题
1. 修复triangulate_faces的自定义数据复制问题
CGAL的Polygon_mesh_processing::triangulate_faces默认仅处理网格拓扑结构,不会自动复制你添加的自定义面数据。你遇到的“一半保留一半清零”是因为默认逻辑未处理自定义属性,仅复用了部分原面内存结构导致的随机现象。要让新生成的三角形继承原面数据,需要自定义面数据复制策略,通过函数可选参数传入:
实现步骤:
- 定义复制仿函数,负责将原面的自定义数据拷贝到新面:
struct CopyCustomFaceData { template<typename Face> void operator()(const Face& original_face, Face& new_face) const { // 假设自定义数据存储在面的my_data成员中 new_face.my_data = original_face.my_data; } }; - 调用
triangulate_faces时,通过face_copy_map参数传入该仿函数:
这样四边形拆分出的两个三角形都会完整继承原面的CGAL::Polygon_mesh_processing::triangulate_faces( your_polyhedron, CGAL::parameters::face_copy_map(CopyCustomFaceData()) );my_data。
2. 布尔运算(corefine_and_compute_union)的数据保留
这类布尔运算同样支持通过命名参数传递属性复制逻辑:
- 若自定义数据未直接嵌入面类,先创建属性映射:
auto face_data_map = your_polyhedron.add_property_map<Polyhedron::Face_handle, MyData>("face:my_data").first; - 调用布尔运算时,通过
face_property_maps参数指定属性传递规则,比如让新面继承对应原面的数据:
注:具体参数需根据CGAL版本和接口调整,核心是明确指定自定义属性的传递方式。CGAL::corefine_and_compute_union( polyA, polyB, result_poly, CGAL::parameters::face_property_maps(face_data_map_A, face_data_map_B, face_data_map_result) );
3. 重网格化操作的数据保留
对于remesh这类重网格化函数,需要通过Face_split_handler处理面拆分时的数据复制:
- 定义拆分处理器,在面被拆分时将原面数据复制给新面:
struct FaceSplitHandler { template<typename Face, typename Halfedge> void operator()(const Face& original_face, Face& new_face1, Face& new_face2, const Halfedge&) const { new_face1.my_data = original_face.my_data; new_face2.my_data = original_face.my_data; } }; - 调用
remesh时传入该处理器:CGAL::Polygon_mesh_processing::remesh( your_polyhedron, target_edge_length, CGAL::parameters::face_split_handler(FaceSplitHandler()) );
关键注意事项
- 确保自定义
Polyhedron_items_3的面类复制构造函数能正确拷贝自定义数据:若成员为可拷贝类型,可依赖编译器默认生成;否则需显式实现复制构造函数。 - 若使用CGAL属性映射系统而非直接嵌入成员,要确保属性映射在网格操作前后能正确关联面元素。
内容的提问来源于stack exchange,提问作者user16978892
相关产品推荐
相关产品推荐

