在回答“给定四个坐标检查它是否形成正方形”时,我遇到了这个答案,它检查平行四边形,然后检查直角。这有效,但前提是输入的点按特定顺序。也就是说,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]
每个排列都有六个段到段检查,所以总共有 18 次比较。
我想不出任何其他方法来做到这一点,但似乎我错过了一些东西。有一个更好的方法吗?为方形问题给出的答案很好,但如果我必须进行额外(最多)18 次检查以验证点的顺序是否正确,那么使用角间距离会更快。