CGAL Polyline Simplification简化后自交问题的原因与解决方案咨询
回答
问题1:为什么简化操作会产生自交结果
你当前使用的Squared_distance_cost成本函数仅计算移除单个顶点带来的几何误差(即被移除顶点到新生成边的平方距离),不会校验移除顶点后多段线的拓扑一致性,自然无法预判是否会产生自交。
结合你的测试用例,当算法移除顶点(33,27)时,直接生成了(64,20)到(27,9)的新边,这条边会和后续的相邻段产生交叉,而默认的成本逻辑完全不会拦截这类操作,最终就输出了带自交的结果。
问题2:避免自交的调整方案
你可以根据需求选择以下任意一种修改方式:
- 更换带自交校验的成本函数(最推荐)
CGAL的Polyline Simplification包内置了自交校验逻辑,你可以将成本函数替换为Hybrid_squared_distance_cost,一旦移除顶点会产生自交,对应的成本会被设为无穷大,算法就不会选择移除该顶点。
修改步骤:
- 引入对应头文件:
#include <CGAL/Polyline_simplification_2/Hybrid_squared_distance_cost.h> - 替换成本函数定义:
typedef PS::Hybrid_squared_distance_cost<K> Cost; - 调用简化函数时传入权重参数:
PS::simplify(ct, Cost(2), Stop(0.2));,权重值越大,自交校验的优先级越高,可根据需求调整。
- 改用多边形简化专用接口
如果你处理的是闭合多边形,直接换用CGAL的Polygon_simplification包更合适,这个包的简化逻辑默认保证输出多边形无自交,不需要额外配置拓扑校验。 - 调整简化阈值
如果对简化率要求不高,可以增大Stop阈值(比如改为0.5),保留更多原始顶点,也能降低自交出现的概率。
另外你输出结果末尾重复的(64,20)是因为插入的闭合多段线首尾点相同,输出时判断首尾坐标一致后移除最后一个点即可修复。
内容的提问来源于stack exchange,提问作者fillmoon
相关产品推荐
相关产品推荐

