相关问题:多边形分解 - 移除凹点以形成凸多边形
我正在寻找一种算法,能够实现以下功能:
输入是一个二维点数组(P0…PN-1),数组长度N的大小不固定(3 ≤ N < ∞)。对于任意M ≤ N,可能存在由P0…PM-1这些点按某种顺序组成的凸多边形。
注意:边缘不一定是数组中相邻的点对。
最有效的算法是什么,以便找到最大的M,使得这个凸多边形存在?
我的当前算法非常低效。我首先测试M = 3,然后是M = 4,M = 5等等,计算出凸包,然后测试所有的P0…PM-1是否是凸包的顶点,如果不是,则退出循环并返回M-1。
示例 #1: [(-2,2), (2,2), (-2,-2), (-1,1)]
结果: 3 (因为前三个点形成了一个三角形,但添加P3 = (-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)]
(前三个点共线:我不认为算法能够处理这种情况。)