Geometry 多边形分解-删除凹点以形成凸多边形
我想解构以下以蓝色显示的多边形,移除多边形中导致凹陷的所有点 目前,我一直在尝试做的是:Geometry 多边形分解-删除凹点以形成凸多边形,geometry,computational-geometry,convex-optimization,convex-polygon,Geometry,Computational Geometry,Convex Optimization,Convex Polygon,我想解构以下以蓝色显示的多边形,移除多边形中导致凹陷的所有点 目前,我一直在尝试做的是: 从多边形中取出每个点 测试该点,以查看它是否位于由集合的其余部分创建的多边形内 如果为true,则删除该点 如果是错误的话,就坚持这一点 这在大多数情况下都有效,但在前一种情况下,(2,3)和(2,4)处的点不会同时移除。在这两种情况下,其中一个点将被删除,但另一个点将不被删除,这取决于数组传入的顺序 我想知道的是: 是否有某种方法可以测试我正在处理的多边形是否有这些情况之一(即:连续3个失败点?)
- 从多边形中取出每个点
- 测试该点,以查看它是否位于由集合的其余部分创建的多边形内
- 如果为true,则删除该点
- 如果是错误的话,就坚持这一点
或
谢谢。为什么不简单地计算点的凸包呢 这是一个研究得很好的问题,书上和网上都有很多算法。“扫描角度”的方法尤其常见,例如
我想也许你在找那个 首先想到的算法是QuickHull。首先,取最左边和最右边的点l和r。它们一定在船体上 在船体上构造一个由两个外表面组成的第一个猜想,一个从l到r,一个从r到l。所以你有一个体积为零的多边形 将所有剩余点分为lr前面的点和rl前面的点 从那时起,当任何面前面有任何点时:
- 找到离面最远的点
- 删除此边并将其替换为两条边,一条从原始起点到最远点,另一条从最远点到原始终点
- 在旧面前面的所有点中,将这些点放在已添加到其“前面”集中的第一个新面前面,将第二个面前面的点放在其“前面”集中,并且不保留对当前内部面的任何引用
最后,您将得到凸包。您正在寻找的是所谓的“凸包”查找。寻找解决这个问题的算法。该算法易于实现。找到外壳后,只需删除不属于外壳的所有点。请注意,凸面外壳已在某些语言/环境中实现 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]]