2016-04-17 26 views
0

Direct way of computing clockwise angle between 2 vectorsの答えは、2つのベクトル間の時計回りの角度を得るのに役立ちましたが、特定のベクトルから時計回りの方向に2つのベクトルから角度を取得する方法です。Delaunay Triangulation不適切な角度とエッジ

ここでは、私が何を言おうとしているのかを視覚的に説明します。赤ベクトルから時計回り方向に向かうときに、時計回りの角度がこれである:(悪い図面すみません)

enter image description hereenter image description here

しかし黒ベクトルから時計回り方向に向かうときに、時計回りの角度はこれです:

enter image description hereenter image description here

EDIT:私は私の質問を言い換えます。これが私が達成しようとしていることです。 http://www.geom.uiuc.edu/~samuelp/del_project.html#algorithms

上記の画像を使用して、私はいつも特定のベクトルから時計回りに角度を進めたいと考えています。私はSO角度計算が誤って不要なエッジが接続することを可能にする角度を取得するには答えるが、

float dotProd = vx*ux + vy*uy; 
    float det = vx*uy - vy*ux; 
    float angle = MathUtils.atan2(det, dotProd);//in radians 
    if(angle < 0) angle += MathUtils.PI; 

私の状況での不正なリンクのコードを使用しています。

enter image description here

私はこれをどのように修正することができますか?

+0

コードは正しいです。第1の(V)ベクトルを回転させて第2のベクトル(U)と同一直線にするために必要な正の方向の角度を求める。このアプローチがあなたの三角測量の問題にどのように関係しているかは不明です。 – MBo

答えて

0

もっと短い方法がありますが、0,0がどこにあるのかを知っていれば が最初にどの四半期にベクタがあるかをチェックし、それに応じて計算を実行してください。

それはあなたの解決策を解決しますが、数学的にはもっと速く到達できると思います。

0

私はこれらの実験でした:計算された角度が即時角度であるようだ

int[] v1={5, 2}, v2={3, 4}, v3={5, 0}; 
double d1=v1[0]*v2[0]+v1[1]*v2[1], d2=v1[0]*v2[1]-v1[1]*v2[0]; 
System.out.println(Math.toDegrees(Math.atan2(d2, d1))); 
d2=v2[0]*v1[1]-v2[1]*v1[0]; 
System.out.println(Math.toDegrees(Math.atan2(d2, d1))); 
d1=v3[0]*v1[0]+v3[1]*v1[1]; d2=v3[0]*v1[1]-v3[1]*v1[0]; 
System.out.println(Math.toDegrees(Math.atan2(d2, d1))); 
d1=v1[0]*v3[0]+v1[1]*v3[1]; d2=v1[0]*v3[1]-v1[1]*v3[0]; 
System.out.println(Math.toDegrees(Math.atan2(d2, d1))); 
d1=v2[0]*v3[0]+v2[1]*v3[1]; d2=v3[0]*v2[1]-v3[1]*v2[0]; 
System.out.println(Math.toDegrees(Math.atan2(d2, d1))); 

を:それは否定的であれば、それはポジティブだ場合の方向は、(例えばV3からV2に)反時計回りで、それはあります時計回りに。

私は標準的なJava atan2を使用しています。私はあなたが使っていることを知っていません。

したがって、常に時計を得るためには、結果をチェックする必要があります。正の場合は360度を引いてください。

この否定的/肯定的なことを確認するには、独自の実験を行う必要があります。

関連する問題