Python(2.7)で関数を書こうとしています。この関数は、頂点の座標を表す 8 つの値のリストを受け取ります。
( 入力の形式は [Ax,Ay,Bx,By,Cx,Cy,Dx,Dy] です)
関数は、有効な長方形を形成するためにこれらの頂点が与えられているかどうかを判断します。
そうでない場合は、それらを順番に並べて、これらの頂点の並べ替えられたリストを返します。開始点または方向 (時計回りか反時計回りか) は重要ではありません。
私が望むものを説明しましょう:
与えられた入力が下のリンクの 2 番目または 3 番目の形状を形成する場合。関数はそれを最初のものに変換します。
http://i.stack.imgur.com/IsRqr.png
これを行うためにどのアルゴリズムを使用できますか?
アレクセイが提案した方法を使用して、コードを記述しました。いくつかの最適化が必要になる場合がありますが、私の ATM では必要ありません。
def crossProduct(vector1,vector2) :
a,b,c = vector1
d,e,f = vector2
vector3 = (b*f-c*e , -a*f+c*d , a*e-b*d)
return vector3
def fixRect(rectList) :
Ax,Ay,Bx,By,Cx,Cy,Dx,Dy = rectList[:]
v12 = (Bx-Ax,By-Ay,0)
v13 = (Cx-Ax,Cy-Ay,0)
v14 = (Dx-Ax,Dy-Ay,0)
z1 = crossProduct(v13,v12)[2]
z2 = crossProduct(v13,v14)[2]
if z1*z2 < 0 : # if two z values have different sign, they are in order
return [Ax,Ay,Bx,By,Cx,Cy,Dx,Dy]
# else swap 2 and 3
Ax,Ay,Cx,Cy,Bx,By,Dx,Dy = rectList[:]
# repeat
v12 = (Bx-Ax,By-Ay,0)
v13 = (Cx-Ax,Cy-Ay,0)
v14 = (Dx-Ax,Dy-Ay,0)
z1 = crossProduct(v13,v12)[2]
z2 = crossProduct(v13,v14)[2]
if z1*z2 < 0 : # if two z values have different sign, they are in order
return [Ax,Ay,Bx,By,Cx,Cy,Dx,Dy]
# else swap 3 and 4
Ax,Ay,Bx,By,Dx,Dy,Cx,Cy = rectList[:]
# repeat
v12 = (Bx-Ax,By-Ay,0)
v13 = (Cx-Ax,Cy-Ay,0)
v14 = (Dx-Ax,Dy-Ay,0)
z1 = crossProduct(v13,v12)[2]
z2 = crossProduct(v13,v14)[2]
if z1*z2 < 0 : # if two z values have different sign, they are in order
return [Ax,Ay,Bx,By,Cx,Cy,Dx,Dy]
else: raise Exception("Couldn't fix the rectangle")