【问题标题】:Polygon Decomposition - Removing Concave Points to Form Convex Polygons多边形分解 - 去除凹点以形成凸多边形
【发布时间】:2011-05-09 14:54:34
【问题描述】:

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

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

  • 从多边形中取出每个点
  • 测试该点以查看它是否落在集合的其余部分创建的多边形内
  • 如果为真,则删除该点
  • 如果为假,请保留要点

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

我想知道的是:

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

    我想您可能正在寻找convex hull

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

    对船体进行第一次猜测,它有两个向外的面,一个从 l 到 r,一个从 r 到 l。所以你有一个体积为零的多边形。

    把剩下的点分成lr前面的点和rl前面的点。

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

    • 找到离脸部最远的点
    • 删除这条边,用两条边代替,一条从原始起点到最远点,一条从最远点到原始终点
    • 在旧面孔前面的所有点中,将您添加的第一个新面孔前面的点放入其前面的集合中,将第二个前面的点放入其前面的集合中,然后不要保留对现在内部的任何引用

    最后你会得到凸包。

    【讨论】:

      【解决方案2】:

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

      这是一个经过深入研究的问题,其中包含书籍和在线中的许多算法。 “扫角”的方法特别常见,例如。

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

      【讨论】:

        【解决方案3】:

        您正在寻找的东西被称为“凸包”发现。查找here at wikipedia 以了解此问题的算法。 "gift wrapping" 算法很容易实现。找到船体后,只需删除所有不属于船体的点即可。

        【讨论】:

          【解决方案4】:

          请注意,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]]
          

          输出:

          【讨论】:

            猜你喜欢
            • 2011-01-28
            • 1970-01-01
            • 2020-11-02
            • 2013-07-11
            • 1970-01-01
            • 2012-04-30
            • 2013-02-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多