多边形分解 - 去除凹点以形成凸多边形

时间:2010-11-13 19:11:04

标签: geometry computational-geometry convex-optimization convex-polygon

我想解析以蓝色显示的以下多边形,从多边形中删除导致凹陷的所有点。

alt text

目前,我一直试图做的是:

  • 从多边形中取出每个点
  • 测试点以查看它是否属于由其余集合
  • 创建的多边形
  • 如果为true则删除该点
  • 如果为false则保留点

这在大多数情况下有效,但在前一种情况下,(2,3)和(2,4)处的点都不会被删除。在这两种情况下,其中一个点将被删除,但另一个点将不依赖于传入数组的顺序。

我想知道的是:

  1. 有没有办法测试我正在处理的多边形是否恰好有这些情况之一(IE:连续3个故障点?)
  2. 是否只是创建凸多边形的更有效方法?
  3. 谢谢。

4 个答案:

答案 0 :(得分:6)

我想也许你正在寻找convex hull

首先想到的算法是QuickHull。最初,取最左边和最右边的点l和r。它们必须在船体上。

构造第一个猜测船体的两个外表面,一个从l到r,一个从r到l。所以你有一个体积为零的多边形。

将所有剩余点分为lr前面和rl前面的点。

从那时起,任何一张脸都面前有任何一点:

  • 从脸上找到最远点
  • 删除此边缘并将其替换为两条边,一条从原始起点到最远点,另一条从最远点到原始终点
  • 在旧面前的所有点,将那些放在你已经添加到前面的第一个新面前的那些,将那些放在前面的那个面前放入它的前面。不保留任何对
  • 内的内容的引用

最后你会有凸壳。

答案 1 :(得分:1)

为什么不简单地计算点的凸包?

这是一个经过充分研究的问题,书籍和在线都有许多算法。 “扫掠角度”的方法是特别常见的,例如,

http://courses.csail.mit.edu/6.854/06/scribe/s25-rasmu-sweepline.pdf

答案 2 :(得分:0)

您正在寻找的是“凸壳”发现。查看here at wikipedia以了解此问题的算法。 "gift wrapping"算法易于实现。当你找到船体时,只需移除所有不属于船体的点。

答案 3 :(得分:0)

请注意,Convex Hull已在某些语言/环境中实施。

Mathematica中的示例:

<< ComputationalGeometry`; 
   data2D = {{4.4, 14}, {6.7, 15.25}, {6.9,12.8}, {2.1, 11.1}, {9.5, 14.9}, 
             {13.2, 11.9}, {10.3, 12.3}, {6.8, 9.5}, {3.3, 7.7}, {0.6, 5.1}, 
             {5.3, 2.4}, {8.45, 4.7}, {11.5,9.6}, {13.8, 7.3}, {12.9, 3.1}, 
             {11, 1.1}};

PlanarGraphPlot[data2D, ConvexHull[data2D]]

输出:

alt text