【发布时间】:2013-08-06 15:12:43
【问题描述】:
在将an answer 分配给"Given four coordinates check whether it forms a square" 时,我遇到了this answer,它检查平行四边形,然后检查直角。这有效,但前提是输入的点按特定顺序。也就是说,P1 和 P3 必须彼此“相反”,而不是相邻。
所以,问题。如果进来的四个点可以按任何顺序排列,你如何对它们进行排序,使它们按“正确”的顺序形成一个四边形?
我能想到的最简单的方法是:
for each valid permutation of points[]{ // see below for "valid"
generate line segment for:
points[0] -> points[1]
points[1] -> points[2]
points[2] -> points[3]
points[3] -> points[0]
if any line segment crosses another // use cross product
continue
return permutation
}
我知道大多数排列都是简单的旋转(0123 == 1230),所以我可以保持第一点“固定”。另外,我认为我可以通过仅考虑每个排列点的0 和2 中的点来减少它,因为其他两个的顺序无关紧要。例如,如果0123 是一个多边形,那么0321 也是,因为它会生成相同的线段。
这让我只需要检查三个基本排列:
[0,1,2,3][0,1,3,2][0,2,1,3]
每个排列都有 6 次分段检查,因此总共有 18 次比较。
我想不出任何其他方法来做到这一点,但似乎我错过了一些东西。有一个更好的方法吗?正方形问题的答案很好,但如果我必须进行额外(最多)18 次检查以验证点的顺序是否正确,那么使用角间距离会更快。
【问题讨论】:
-
这个问题是专门针对正方形问题的四边形,你想要一个所有四边形的通用解决方案还是可以?
-
最好使用通用解决方案。问题开始是“如何弄清楚如何将它们放入方形问题中”,但我猜它可能还有其他有用的应用程序。
-
我有一个愚蠢的问题:我们说的是二维点,对吧?
-
@beaker 是的,2D 仅用于此问题。