相关: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)]
结果:3(因为前三个点形成一个三角形但添加P 3 = (-1,1)
会使多边形非凸)
示例#2:[(-2,2), (2,2), (-2,-2), (1,-1)]
结果:4(因为可以从数组中的所有4个点构造凸四边形)
更新示例#3:[(-3,3), (3,3), (2,-1), (-3,-3), (3,-3), (-2,1)]
结果:4。
此示例说明了为什么仅使用所有提供的点的凸包并找到作为其子集的前缀是不够的。 (3,-3)
不能是由前五个点组成的凸多边形的一部分,因为之前的点(2,-1)
将不再位于船体上。但是(3,-3)
必须被拒绝,即使它位于所有六个点的船体上,(2,-1)
没有。
无效输入的示例:
[(-1,-1), (0,0)]
(点数太少)[(-1,-1), (0,0), (1,1), (1, -1)]
(前三个是colinear:我不希望算法能够处理这个问题。)答案 0 :(得分:2)
我想你想要一个增量凸壳。以下是一些链接:
答案 1 :(得分:2)
您可以在O(m lg m)时间内完成此操作。
答案 2 :(得分:2)
答案 3 :(得分:0)
如果您尝试某种二分搜索怎么办?每次整个前缀形成凸多边形时,前缀的大小加倍。每次失败时,都会将前缀的大小缩小到当前大小和之前大小的一半。