You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:27:08