形成凸多边形的顶点数组的最大前缀

时间:2011-01-14 19:17:39

标签: algorithm geometry convex-hull convex-polygon

相关:Polygon Decomposition - Removing Concave Points to Form Convex Polygons

我正在寻找一种算法来执行以下操作:

输入是2D点阵列(P 0 ... P N-1 )。阵列的长度N变化(3≤N​​<∞)
对于任何M≤N,可能有也可能没有凸多边形,其顶点按某种顺序为P 0 ... P M-1

注意边缘不一定是数组中的相邻对。

找到最大M的最有效算法是什么,这个凸多边形存在?

我目前的算法非常低效。我测试M = 3然后M = 4,M = 5等,计算船体然后测试所有P 0 ... P M-1 是船体的顶点如果没有,那么我就会突破循环并返回M-1。

示例#1:[(-2,2), (2,2), (-2,-2), (-1,1)]
Diagram for example #1
结果:3(因为前三个点形成一个三角形但添加P 3 = (-1,1)会使多边形非凸)

示例#2:[(-2,2), (2,2), (-2,-2), (1,-1)]
Diagram for example #2
结果:4(因为可以从数组中的所有4个点构造凸四边形)

更新示例#3:[(-3,3), (3,3), (2,-1), (-3,-3), (3,-3), (-2,1)] alt text
结果:4。

此示例说明了为什么仅使用所有提供的点的凸包并找到作为其子集的前缀是不够的。 (3,-3)不能是由前五个点组成的凸多边形的一部分,因为之前的点(2,-1)将不再位于船体上。但是(3,-3)必须被拒绝,即使它位于所有六个点的船体上,(2,-1)没有。

无效输入的示例:

  • [(-1,-1), (0,0)](点数太少)
  • [(-1,-1), (0,0), (1,1), (1, -1)](前三个是colinear:我不希望算法能够处理这个问题。)

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:2)

您可以在O(m lg m)时间内完成此操作。

  • 将上部船体和下部船体点存储在由X坐标键入的搜索树中。
  • 当新点到达时,找到覆盖其X值的上下线段(搜索树)。
  • 如果新点在两条线之间,那么它不在船体上。放弃。
  • 否则,将该点插入上部或下部船体(以较近的线段为准)。
  • 如果插入点将相邻点转入内角,则它们不在船体上。放弃。
  • 处理边缘情况,例如新的最左点,垂直点等。
  • 继续,直到处理完所需的点数。

答案 2 :(得分:2)

答案 3 :(得分:0)

如果您尝试某种二分搜索怎么办?每次整个前缀形成凸多边形时,前缀的大小加倍。每次失败时,都会将前缀的大小缩小到当前大小和之前大小的一半。