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
( here )のドキュメントをご覧ください。
あなたが探しているのは、B(あなたの左上のベクトル)とA(あなたの右下のベクトル)の違いを見つけて、これをパラメータとしてatan2
に渡します。
return Math.Atan2(b.Y - a.Y,b.X - a.X);
コードが現在行っていることは、0,0
を参照してベクトルb
の角度を見つけ、0,0
を参照してベクトルa
の角度を減算することです。
常に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#は私の世界ではないため、これは疑似コードです。ごめんなさい
「ベクトルaとbの間の角度」を探している場合は、ベクトルaの角度とベクトルbの角度のデルタが必要です。
Math.Atan2(b.Y, b.X) - Math.Atan2(a.Y, a.X)
しかし、ダイアグラムは「ベクトル間の角度」と一致しません。図の答えは確かに前の答えです。
Math.Atan2(b.Y - a.Y, b.X - a.X)
Atan2メソッド内でxとyの違いを使用する必要があります。
Math.Atan2(b.Y - a.Y,b.X - a.X);
また、これは0
提供した三角形の斜辺に(完全に定かではありません)。
Math.PI - angle
。
パーティーには少し遅れますが、Vectorクラスの静的メソッドはどうですか。
Vector.AngleBetween(vector1, vector2)
tan(角度)=反対/隣接
arctan(反対/隣接)=角度
反対= a.y-b.y
隣接= b.x-a.x
Math.Atan((a.Y - b.Y) / (b.X - a.X));
あなたはvector2クラスを使用しているので、私はあなたが使用できると思います
a-b
aからbへのベクトルを取得します。
したがって、必要な角度は次のとおりです。Pi-角度(a-b)。