我想解析以蓝色显示的以下多边形,从多边形中删除导致凹陷的所有点。
目前,我一直试图做的是:
这在大多数情况下有效,但在前一种情况下,(2,3)和(2,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]]
输出: