多边形分解 - 去除凹点以形成凸多边形
-
09-10-2019 - |
题
我想解构以蓝色所示的以下多边形,从而从多边形去除引起凹的所有点。
目前,我一直在尝试做的是:
- 从多边形中取出每个点
- 测试点,看看它是否属于集合的其余部分产生的多边形
- 如果true删除点
- 如果false保持重点
在大多数情况下,这起作用,但是在以前的情况下,(2,3)和(2,4)的点不会删除。在这两种情况下,这两个点都将被删除,但另一个将不取决于数组的传递顺序。
我想知道的是:
- 是否有一些方法可以测试我要处理的多边形是否碰巧有一种情况(即连续3点失败点?)
或者 - 是否只是创建凸多边形的更有效的方法?
谢谢你。
解决方案
我想也许您正在寻找 凸壳?
想到的第一种算法是QuickHull。最初,以最左侧和最右点为l和r。他们必须在船体上。
在船体上构建第一个猜测,是两个向外的脸,一个从L到R,一个从R到L。因此,您的多边形量为零。
将所有剩余的点分为LR前面和RL前面的点。
从那时起,虽然任何脸部都有任何要点:
- 从脸上找到最远的点
- 删除此边缘并用两个边替换它,一个从原始起点到最远的点,一个从最远的点到原始终点
- 在旧面前的所有要点中保留对现在内部的任何引用
最后,您将拥有凸船体。
其他提示
为什么不简单地计算点的凸壳呢?
这是一个精心研究的问题,其中有许多书籍和在线算法。一种“扫角”的方法特别普遍,例如。
http://courses.csail.mit.edu/6.854/06/scribe/s25-rasmu-sweepline.pdf
请注意,凸壳已经在某些语言/环境中实现。
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]]
输出:
不隶属于 StackOverflow