什么是减少多边形中顶点数量而不改变它看起来非常多的好算法?

输入:一个多边形,表示为一个点列表,具有太多的顶点:例如来自鼠标的原始输入。

输出:具有少得多的顶点的多边形仍然看起来很像原始的:例如可用于碰撞检测的东西(不一定是凸面的)。

编辑:对此的解决方案类似于在图表上找到最佳拟合的多分段线。在我的算法书中,它被称为分段最小二乘法。

Edit2:Douglas Peucker算法就是我真正想要的。

有帮助吗?

解决方案

编辑:哦,看,简化多边形

您提到了碰撞检测。您可以非常简单地计算它周围的边界凸包。

如果您关心凹陷区域,可以通过获取多边形的质心并选择要开始的点来计算凹形外壳。从起点开始围绕质心旋转,找到要保留的每个顶点,并将其指定为边界外壳中的下一个顶点。算法的复杂性将来自你如何确定要保留哪些顶点,但我确信你已经想到了这一点。您可以根据它们相对于质心的位置将所有顶点放入桶中。当一个桶获得超过任意数量的顶点时,您可以将其拆分。然后将该桶中顶点的平均值作为要在边界外壳中使用的顶点。或者,忘记水桶,当你在质心周围移动时,只选择一个点,如果它距离最后一个点超过给定距离。

实际上,你可能只是使用多边形中的所有顶点作为“点云”。并计算周围的凹壳。我会找一个算法链接。最糟糕的情况是完全凸起的多边形。

另一种选择是从边界矩形开始。对于矩形上的每个顶点,找到从该点到多边形的距离。对于最远的顶点,将其拆分为两个顶点并将其移动到一些顶点中。重复,直到满足某些顶点或区域的比例。我不得不多考虑一下这个细节。

如果您关心实际上看起来相似的多边形,即使在自相交多边形的情况下,也需要另一种方法,但是由于您询问了碰撞检测,因此听起来并不是必需的。

帖子包含有关凸包部分的一些详细信息。

其他提示

那里有很多材料。只需谷歌搜索“网格缩小”,“网格简化”,“网格优化”等内容。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top