我正在寻找一种算法来执行以下操作:
输入是二维点数组 (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)]
(前三点是共线的:我不希望算法能够处理这个问题。)