我有一个生成轮廓的库,例如:
[[464.5, 551. ],
[464.5, 550. ],
[464. , 549.5],
[463.5, 549. ],
[463. , 548.5],
[462. , 548.5],
[461. , 548.5],
[460.5, 549. ],
[460. , 549.5],
[459. , 549.5],
[458. , 549.5],
[457. , 549.5],
...
坐标通过直线连接,从而定义了一个封闭的不规则,不自相交的多边形。
从上面的示例中,我们可以看到可以删除一些点而不会损失任何表面积,但是我不在乎算法是否有损失,只要它是可配置的(例如面积与联合的交集)区域> x或其他内容?)
是否有一些已知的算法可以减少闭合轮廓的点数?
PS:朴素的算法是测试点的所有子集,并采用高于可接受损耗的最小子集。问题是我可能有数百个坐标,并且子集的数量是指数的(2 ^(coord_count))。甚至计算损失也很昂贵:我需要计算2个多边形的交集和并集,然后计算其表面。
编辑:
答案 0 :(得分:1)
我建议执行以下步骤:
在最坏的情况下,该算法的初始版本为O(N^2)
。您可以通过使用BST /堆跟踪每个点对应的面积增量来对它进行某种程度的优化,尽管更新可能很麻烦。用于相交测试的四叉树可能也很有用,尽管它会产生O(N log N)
的设置代价,只有在删除大量点后才能将其设为否定。
Douglas-Peucker并不总是产生 optimum 结果(在不超过面积差阈值的情况下,尽可能多地删除点);原始算法也没有考虑到自相交。
答案 1 :(得分:0)
Alex Kemper 对该问题的评论回答了我的问题:
<块引用>Ramer-Douglas-Peucker algorithm 可以很好地减少路线的点数。可以指定所需的精度(= 最大误差)
我使用了这个算法,在 scikit-image lib 中实现:axis=1