3Dの凸多角形があります。簡単にするために、頂点のある正方形とし(0,0,0),(1,1,0),(1,1,1),(0,0,1).
ます。これらの頂点を反時計回りに配置する必要があります。私はここで解決策を見つけました。ポリゴンの中心の角度を決定し、それらを並べ替えることをお勧めします。それがどのように機能するのかはわかりません。誰かが解決策を持っていますか?堅牢で、頂点が非常に接近したときにも機能するソリューションが必要です。
サンプルのMATLABコードをいただければ幸いです。
幸いなことに、凸多角形があるので、角度のトリックを使用できます。内部の点を見つけ(たとえば、隣接していない2つの点の中点を見つけます)、すべての頂点にベクトルを描画します。1つのベクトルをベースとして選択し、他のベクトルに対する角度を計算して順序付けます。内積を使用して角度を計算できます。A・B=ABcosθ=|A || B | cosθ。
これは実際にはかなり退屈な問題なので、実際に行うのではなく、どのように行うかを説明します。最初に平面の方程式を見つけ(これには3つの点のみを使用する必要があります)、次に回転行列を見つけます。次に、新しい回転空間でベクトルを見つけます。その後、すべてのことを言い終えて 、ポイントがどの象限にあるかを見つけます。特定の象限でn> 1の場合は、各ポイントの角度を見つける必要があります(theta = arctan(y / x))。次に、各象限を角度で並べ替えます(おそらく、象限の代わりに円周率で分離することができます(y成分(回転後)がゼロより大きい場合にポイントを並べ替えます)。
申し訳ありませんが、実際にこれをテストする時間はありませんが、試してみて、コードを投稿してください。必要に応じてデバッグをお手伝いします。
以下は私が行った手順です。
3D平面ポリゴンは、既知の式を使用して2D平面に回転できます。軸と角度からの回転行列のセクションの下にあるものを使用します。
次に、@ Glennで示されているように、角度を見つけるために内部点を計算する必要があります。私はその内部点をmean
頂点の位置と見なします。
x軸を参照軸として使用すると、ここで説明する関数を使用して、各頂点のスケール上の角度0
を2pi
計算できます。atan2
ベクトルaからベクトルbまで反時計回りに測定された非負の角度は、との範囲で[0,2pi]
、次の式で与えられます。a = [x1,y1]
b = [x2,y2]
angle = mod(atan2(y2-y1,x2-x1),2*pi);
最後に、角度を並べ替えます[~,XI] = sort(angle);
。
これを使用してから長い時間が経過しているので、間違っている可能性がありますが、コマンドconvhull
は必要なことを実行すると思います-一連のポイントの凸包を返します(ポイントは凸集合であると言うので、ポイント自体のセット)、反時計回りの順序で配置されます。
MathWorksは最近、他の古い計算幾何学のもののDelaunayTri
機能に取って代わることを目的とした新しいクラスを提供したことに注意してください。convhull
特にポイントが非常に接近している場合は、より正確だと思います。しかし、私はそれを試していません。
お役に立てば幸いです。
したがって、convhullを使用する場合は、別の答えがあります。1つの座標をゼロに設定することで、ポリゴンを軸平面に簡単に投影できます。たとえば、(0,0,0)、(1,1,0)、(1,1,1)、(0,0,1)で、y = 0を設定して(0,0)、(1、 0)、(1,1)、(0,1)。今あなたの問題は2Dです。
ポリゴンの平面がある軸に直交している場合は、正しい座標を選択するためにいくつかの作業を行う必要がある場合があります。直交している場合は、その軸を選択します。基準は、投影されたポイントが線上にないことを確認することです。