【发布时间】:2011-06-09 08:40:26
【问题描述】:
相关:Polygon Decomposition - Removing Concave Points to Form Convex Polygons
我正在寻找一种算法来执行以下操作:
输入是一个二维点数组(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)](前三点是共线的:我不希望算法能够处理这个问题。)
【问题讨论】:
-
这与传统的凸包有何不同?我们想要顶点数最多的凸包吗?
-
@biziclop,是的,我想要顶点数最多的船体。而且我希望它可以比为每个可能的尺寸计算船体更有效。
-
正如 biziclop 提到的:这只是找到一组点的凸包的问题。这个凸包边缘的点数就是你的大小。因此,O(n*log(n)) 使用 Graham's Scan 或 Quick-Hull 算法。还是我错过了什么?
-
@Bart Kiers,不完全是。我只对作为数组前缀的外壳感兴趣。当我看到一个不能成为船体一部分的点时,我必须停止扫描阵列。任何后续点都必须忽略,即使它们可能是(不同)船体的一部分。
-
@Bart Kiers,我添加了示例 #3 来说明这一点。
标签: algorithm geometry convex-hull convex-polygon