2 つのベクトル間の角度を計算しようとしています。私はこれを試しましたが、常にゼロを返します:
public double GetAngle(Vector2 a, Vector2 b)
{
double angle = Math.Atan2(b.Y, b.X) - Math.Atan2(a.Y, a.X);
return angle;
}
GetAngle(new Vector2(1,1), new Vector2(50,50));
atan2
(ここ)のドキュメントをご覧ください。
あなたが探しているのは、B(左上のベクトル)とA(右下のベクトル)の違いを見つけて、これをパラメーターとしてに渡すことです。atan2
return Math.Atan2(b.Y - a.Y,b.X - a.X);
あなたのコードが現在行っていることは、を参照してベクトルの角度を見つけ、b
を参照し0,0
てベクトルの角度を引くa
こと0,0
です。
常に0になる理由は、1,1
と50,50
が交差する同じ行上にあるためです0,0
(両方の呼び出しは約何かを返します0.785398
)。したがって、それらを減算すると、次のようになります。0
以下の .NET ソース コードからのコピーのようなコードが参考になると思います。
参照: http://referencesource.microsoft.com/#WindowsBase/Base/System/Windows/Vector.cs,102
/// <summary>
/// AngleBetween - the angle between 2 vectors
/// </summary>
/// <returns>
/// Returns the the angle in degrees between vector1 and vector2
/// </returns>
/// <param name="vector1"> The first Vector </param>
/// <param name="vector2"> The second Vector </param>
public static double AngleBetween(Vector vector1, Vector vector2)
{
double sin = vector1._x * vector2._y - vector2._x * vector1._y;
double cos = vector1._x * vector2._x + vector1._y * vector2._y;
return Math.Atan2(sin, cos) * (180 / Math.PI);
}
簡単な解決策は次のとおりです。
Vector2 a_normalized = normalize(a);
Vector2 b_normalized = normalize(b);
double angle = arccos(dot(a_normalized,b_normalized));
http://simple.wikipedia.org/wiki/Dot_product
C# は私の世界ではないため、これは疑似コードです。ごめん
Atan2メソッド内でxとyの違いを使用する必要があります。
Math.Atan2(b.Y - a.Y,b.X - a.X);
また、これ0
により、提供した三角形の直角三角形からの角度が得られると思います(完全にはわかりません)。
試してみることをお勧めしMath.PI - angle
ます。
tan(角度) = 反対/隣接
arctan(反対/隣接) = 角度
反対 = ay - by
隣接 = bx - ax
Math.Atan((a.Y - b.Y) / (b.X - a.X));
あなたはvector2クラスを使用しているので、使用できると思います
ab
a から b へのベクトルを取得します。
必要な角度は、Pi - angle(ab) です。