2017-04-19 10 views
1

:あなたはこれを与える場合結果範囲0と2つの3Dベクトル間の角度 - 私は2つのベクトルとして考えるの三点(下記参照)との間の角度を計算する方法を探しています360

using System.Windows.Media.Media3D; 

public static float AngleBetweenThreePoints(Point3D[] points) 
{ 
    var v1 = points[1] - points[0]; 
    var v2 = points[2] - points[1]; 

    var cross = Vector3D.CrossProduct(v1, v2); 
    var dot = Vector3D.DotProduct(v1, v2); 

    var angle = Math.PI - Math.Atan2(cross.Length, dot); 
    return (float) angle; 
} 

を以下の点:

var points = new[] 
{ 
    new Point3D(90, 100, 300), 
    new Point3D(100, 200, 300), 
    new Point3D(100, 300, 300) 
}; 

または以下:

var points = new[] 
{ 
    new Point3D(110, 100, 300), 
    new Point3D(100, 200, 300), 
    new Point3D(100, 300, 300) 
}; 

あなたは同じ結果を得ます。私は、関数の戻り値(0、0、10000)が最初の場合で、(0、0、-10000)が2番目の値を返すことがわかりますが、この情報はcross.Lengthで失われます。結果。

私が探しているのは、結果の範囲0〜360で、0〜180に限定されません。どのように達成できますか?

+0

ザ・180度であるにMath.PIから差し引かれません。あなたの結果は0から360です。したがって、180から引き算すると+180から-180の結果が得られます。 – jdweng

+2

3D空間では、2つのベクトル間の角度は0〜180度の間でのみ定義されます。どんな状況で、180度から360度の間の答えが必要でしょうか?これは、2D空間では、方向または符号付きの角度として定義するのは簡単ですが、3D空間には適用されません。 –

答えて

1

これはお探しですか?

θ_radian=

θ_radian=θ_degree*π/ 180

ベクトルPとQとのARCCOS((P⋅Q)/(|P||Q|))

EDIT 0-360範囲

angle = angle * 360/(2*Math.PI); 
if (angle < 0) angle = angle + 360; 
+0

それは私の最初の解決策でしたが、同じ問題があります。 0〜180の角度には限界があります。 – imekon

+0

ラジアンの角度は[-π;π]の間隔にあり、πのラジアンの角度は180度ですので、それは0〜180の制限です。しかし私はあなたにラジアンから度に変換する公式を示しました。 –

+0

arccosの結果の範囲は0〜PI(PI * 2ではなく)です。したがって、私が180の制限を述べました。 – imekon

0

答えが参照UPベクトルを提供することである。

public static float AngleBetweenThreePoints(Point3D[] points, Vector3D up) 
{ 
    var v1 = points[1] - points[0]; 
    var v2 = points[2] - points[1]; 

    var cross = Vector3D.CrossProduct(v1, v2); 
    var dot = Vector3D.DotProduct(v1, v2); 

    var angle = Math.Atan2(cross.Length, dot); 

    var test = Vector3D.DotProduct(up, cross); 
    if (test < 0.0) angle = -angle; 
    return (float) angle; 
} 

この10は、ここから来た:https://stackoverflow.com/a/5190354/181622