web-dev-qa-db-ja.com

2つのベクトル間の角度2D

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));

VectorsThe angle I need

11
Sorashi

atan2here )のドキュメントをご覧ください。

あなたが探しているのは、B(あなたの左上のベクトル)とA(あなたの右下のベクトル)の違いを見つけて、これをパラメータとしてatan2に渡します。

return Math.Atan2(b.Y - a.Y,b.X - a.X);

コードが現在行っていることは、0,0を参照してベクトルbの角度を見つけ、0,0を参照してベクトルaの角度を減算することです。

常に0になる理由は、1,150,500,0と交差する同じ線上にあるためです(両方の呼び出しで約0.785398が返されます)。これらを減算すると、 0

18
emartel

以下のようにコードが.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);
}
4
lisency

簡単な解決策はこれであるはずです:

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#は私の世界ではないため、これは疑似コードです。ごめんなさい

2
Alexei

「ベクトル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)
2
RunHolt

Atan2メソッド内でxとyの違いを使用する必要があります。

Math.Atan2(b.Y - a.Y,b.X - a.X);

また、これは0提供した三角形の斜辺に(完全に定かではありません)。

Math.PI - angle

2
Shmiddty

パーティーには少し遅れますが、Vectorクラスの静的メソッドはどうですか。

Vector.AngleBetween(vector1, vector2)
1
Darren

tan(角度)=反対/隣接

arctan(反対/隣接)=角度

反対= a.y-b.y

隣接= b.x-a.x

Math.Atan((a.Y - b.Y) / (b.X - a.X));
0
doctor killer

あなたはvector2クラスを使用しているので、私はあなたが使用できると思います

a-b

aからbへのベクトルを取得します。

したがって、必要な角度は次のとおりです。Pi-角度(a-b)。

0
urlreader