「与えられた4つの座標が正方形を形成するかどうかを確認する」に答えているときに、平行四辺形をチェックしてから直角をチェックするこの答えに出くわしました。これは機能しますが、入ってくるポイントが特定の順序になっている場合のみです。つまり、P1 と P3 は、隣接するのではなく、互いに「反対側」にある必要があります。
では、質問です。入ってくる 4 つの点が任意の順序である可能性がある場合、四角形を作成するための「正しい」順序になるようにそれらを並べ替えるにはどうすればよいでしょうか?
私が思いつくことができる最も簡単なことは次のようなものです:
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
ので、最初のポイントを「固定」しておくことができます。また、他の 2 つの順序は関係ないので、各順列スポットの0
とにあるポイントだけを考えれば、それを減らすことができると思います。2
たとえば、0123
がポリゴンの場合は0321
、同じセグメントを生成するためです。
これにより、確認する基本的な順列が 3 つだけ残ります。
[0,1,2,3]
[0,1,3,2]
[0,2,1,3]
各順列には 6 つのセグメント間チェックがあるため、合計 18 回の比較になります。
これを行う他の方法は考えられませんが、何かが足りないようです。これを行うより良い方法はありますか?四角形の質問に対する回答は適切ですが、ポイントが正しい順序であることを確認するためにさらに (最大で) 18 回のチェックを行う必要がある場合は、コーナー間の距離を使用する方が速くなります。