【发布时间】:2012-02-17 19:32:33
【问题描述】:
所以我有两个数组,每个数组都表示一个简单的封闭多边形,作为按顺序遍历的点数组。最后一个元素与第一个元素相同。我正在为任何 2 个简单的封闭多边形实现一个等于算法。
Array A would be like this [pnt1, pnt2, pnt3, pnt4, pnt5, pnt6, pnt1]
Array B would be like this [pnt2, pnt3, pnt4, pnt5, pnt6, pnt1, pnt2]
Array C would be like this [pnt2, pnt1, pnt6, pnt5, pnt4, pnt3, pnt2]
Array D would be like this [pnt1, pnt2, pnt3, pnt5, pnt6, pnt4, pnt1]
数组 A 和 B 相等,因为点的顺序相同且点相同。数组 A 和 C 相等,因为点的顺序相同(但相反),B 和 C 也是相同的原因。
数组D不等于任何其他数组,因为点遍历是乱序的。
所以我的算法如下:
1) 比较数组的长度,必须包含相同的元素数 - 恒定时间
2) 在 B 集合中找到 A[0] 为 K - 线性搜索,线性时间
3) 看看A[1] = B[K+1] 等直到A[n],线性时间
索引自然会环绕数组的末尾,可能是通过 mod 运算符。
有没有比这更好的算法?
【问题讨论】:
-
我不认为该算法检测到 A 和 C 相同但相反。
-
@Bill True,当它失败时我需要调用它两次(反转第二个参数)或调整内部循环
-
你能保证一个点在多边形中不会出现多次吗?如果没有,您的算法可能会给出假阴性。
-
@Weeble 点可能在多边形中出现不止一次,尽管可能性很小。然而像 [A, B, C, D, E, C, B, A, C] 这样的数组是不会发生的,所以不会有重复的循环。
-
从您的示例中,您的所有多边形似乎都是单点集的排列。是这样吗?