2013-01-17 8 views
9

私は3D点のリストを持っています。私は彼らがすべて同一平面上にいることを知っています。私はそれらを並べ替えるためのセンターとポイントとセンターがある飛行機の法線を持っています。あるポイントが別のポイントの右(または左)にあるかどうかをテストするにはどうすればよいですか?3Dコプレーナ点のリストを時計回りまたは反時計回りに並べる

私は2Dで行う方法を理解しています。 Sort points in clockwise order?は2d点の比較方法を説明しています。だから私は何とかすべてのポイントと中心をローカルの2次元飛行座標に変換する必要があると思う。どうやってやるの?この問題を解決する最も効率的な方法ですか?

//from link: 
// a and b are points 
//center is the center around which to determine order 
//int num = (a.x-center.x) * (b.y-center.y) - (b.x - center.x) * (a.y - center.y); 
//if num=0 then they're on the same line 
//if num <0 or num>0 then a is to the left or right of b 

3Dコプレーナポイントを処理するにはどうすればよいですか?

+0

「時計回り」は3次元で意味を持ちません。これは、平面をどのように見ているかによって決まります。飛行機を回り、突然時計回りに反時計回りになります。 –

+0

@woodchips問題は3-dに固有の問題ではありません。すべての2次元座標系が同じように定義されるわけではありません。どちらの場合も、「時計回り」の意味を定義するだけで済みます。 – DuckMaestro

+0

私はあなたが何を言っているかを知ることは良いことだ。飛行機の法線方向を指定するとこれがクリアされると思いますか?時計回りになっても今の私にとっては大したことではありませんが、それでもポイントをある一定の方向に並べる必要があります。 – AAB

答えて

14

すべてを2Dに変換する必要はありません。

あなたはセンターCと通常のnを持っています。点Bが時計方向または反点からのものであるかどうかを決定するために、ドット( - CBからCN、クロス()を計算します。結果が肯定的である場合、Bは、Aから反時計回りです。負の場合はBAから時計回りです。

関連する問題