CGAL corefine_and_compute_difference前置条件违规报错求助
报错原因
你遇到的CGAL::is_valid_polygon_mesh(tm)预检查失败报错,是因为CGAL的布尔运算要求输入的两个网格必须为无自交、封闭、流形结构、面法向朝向一致的有效多边形网格,你通过CGAL::advancing_front_surface_reconstruction()得到的sv网格不满足上述要求。Release模式下跳过了Debug的断言检查所以不崩溃,但因为网格法向/结构问题才导致运算结果和预期相反。
解决步骤
1. 对重建后的sv网格做校验和修复
在点云重建生成sv网格之后,新增修复和校验逻辑:
CGAL::advancing_front_surface_reconstruction(points.begin(), points.end(), construct); // 新增修复逻辑 // 先修复自交问题 PMP::repair_self_intersections(sv); // 统一所有面的法向朝向 PMP::orient(sv); // 如果网格封闭但法向朝内,翻转法向 if (PMP::is_closed(sv) && PMP::is_outward_oriented(sv) == false) { PMP::reverse_face_orientations(sv); } // 补全网格孔洞(如果点云对应的是封闭物体,按需调用) // PMP::triangulate_hole(...) // 校验sv有效性 if (!CGAL::is_valid_polygon_mesh(sv)) { std::cerr << "sv网格修复失败,无法执行布尔运算" << std::endl; return -1; }
2. 校验输入的blank网格有效性
同样对读取的blank网格做有效性检查,排除输入源问题:
fin >> blank; fin.close(); if (!CGAL::is_valid_polygon_mesh(blank)) { std::cerr << "blank网格无效,请检查输入文件" << std::endl; return -1; }
3. 替换计算内核避免精度问题
你当前使用的Exact_predicates_inexact_constructions_kernel是不精确构造内核,计算过程中会有浮点精度误差,容易导致布尔运算结果异常,替换为精确构造内核即可:
// 把原来的Kernel定义替换为下面这行 typedef CGAL::Exact_predicates_exact_constructions_kernel Kernel;
内容的提问来源于stack exchange,提问作者wenzaifou
相关产品推荐
相关产品推荐

