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

Geometry 多边形分解-删除凹点以形成凸多边形,geometry,computational-geometry,convex-optimization,convex-polygon,Geometry,Computational Geometry,Convex Optimization,Convex Polygon,我想解构以下以蓝色显示的多边形,移除多边形中导致凹陷的所有点 目前,我一直在尝试做的是: 从多边形中取出每个点 测试该点,以查看它是否位于由集合的其余部分创建的多边形内 如果为true,则删除该点 如果是错误的话,就坚持这一点 这在大多数情况下都有效,但在前一种情况下,(2,3)和(2,4)处的点不会同时移除。在这两种情况下,其中一个点将被删除,但另一个点将不被删除,这取决于数组传入的顺序 我想知道的是: 是否有某种方法可以测试我正在处理的多边形是否有这些情况之一(即:连续3个失败点?)

我想解构以下以蓝色显示的多边形,移除多边形中导致凹陷的所有点

目前,我一直在尝试做的是:

  • 从多边形中取出每个点
  • 测试该点,以查看它是否位于由集合的其余部分创建的多边形内
  • 如果为true,则删除该点
  • 如果是错误的话,就坚持这一点
这在大多数情况下都有效,但在前一种情况下,(2,3)和(2,4)处的点不会同时移除。在这两种情况下,其中一个点将被删除,但另一个点将不被删除,这取决于数组传入的顺序

我想知道的是:

  • 是否有某种方法可以测试我正在处理的多边形是否有这些情况之一(即:连续3个失败点?)
  • 有没有更有效的方法来创建凸多边形

  • 谢谢。

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

    这是一个研究得很好的问题,书上和网上都有很多算法。“扫描角度”的方法尤其常见,例如


    我想也许你在找那个

    首先想到的算法是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]]