为何CGAL::optimal_convex_partition_2在简单多边形上执行失败?
问题原因及解决方案
1. 代码中的直接错误:顶点向量格式错误
你的顶点向量vec在换行处遗漏了逗号,导致数值被错误合并:
原代码中:
const std::vector<double> vec = {-640,-160,-640,-384,-448,-384,-448,-448,-320,-448,-320,-384 -128,-384,-128,-152,...
这里-320,-384和-128,-384之间没有逗号,会被解析为-320, (-384-128), -384,即-320,-512,-384,直接导致顶点数量异常(vec元素变为奇数),后续循环中会出现越界访问,生成的多边形顶点存在错误——虽然你的assert(polygon.is_simple())在debug模式下通过(可能是巧合),但optimal_convex_partition_2内部的严格检查会发现多边形不满足简单性要求。
修正方法:在遗漏逗号的位置添加逗号,正确的顶点向量定义如下:
const std::vector<double> vec = {-640,-160,-640,-384,-448,-384,-448,-448,-320,-448,-320,-384, -128,-384,-128,-152,-128,-128,-128,0,-128,24,-128,256,-320,256,-448,64,-320,64,-320,-192,-448,-192,-512,-192,-512,-160 };
2. 额外的兼容性优化
即使修正了顶点向量,仍可能因traits不一致导致判断差异。建议调用optimal_convex_partition_2时显式传入你定义的Tra实例,确保内部使用的谓词和你的Polygon_2一致:
CGAL::optimal_convex_partition_2(polygon.vertices_begin(), polygon.vertices_end(), std::back_inserter(partition_polys), Tra()); // 显式传入traits
验证步骤
修正后重新运行代码,assert(polygon.is_simple())会更可靠地验证多边形的简单性,同时optimal_convex_partition_2的前置条件检查也能通过。
内容的提问来源于stack exchange,提问作者Tama
相关产品推荐
相关产品推荐

