减少闭合轮廓中点数的已知算法

时间:2019-01-03 09:22:15

标签: algorithm

我有一个生成轮廓的库,例如:

  [[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个多边形的交集和并集,然后计算其表面。

编辑:

  • 删除对齐的连续点很容易,并且无疑将是降低后续步骤的时间复杂度的第一步。
  • 我希望的是一个新的多边形,其表面覆盖率几乎相同,但坐标要少得多:我什至不在乎新的多边形是否不使用原始多边形的任何坐标(但这看起来更加复杂)而不是删除原始多边形的一些点。

2 个答案:

答案 0 :(得分:1)

我建议执行以下步骤:

  1. 对于每3个连续点,检查连接两点的线的两边没有与多边形相交。

enter image description here

  1. 如果除去中间点,则计算“面积贡献”;如果它们是凸的,则为负;如果凹的,则为正。

enter image description here

  1. 如果要以最少的点数获得最佳结果,请始终在任何阶段删除使面积净变化最小的点。注意标志。

enter image description here

  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