13

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

ベクトル必要な角度

4

8 に答える 8

22

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

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

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

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

常に0になる理由は、1,150,50が交差する同じ行上にあるためです0,0(両方の呼び出しは約何かを返します0.785398)。したがって、それらを減算すると、次のようになります。0

于 2012-11-19T17:32:29.590 に答える
8

以下の .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);
}
于 2015-01-24T07:57:27.600 に答える
4

簡単な解決策は次のとおりです。

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

于 2014-07-02T21:41:03.180 に答える
2

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

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

また、これ0により、提供した三角形の直角三角形からの角度が得られると思います(完全にはわかりません)。

試してみることをお勧めしMath.PI - angleます。

于 2012-11-19T17:32:05.107 に答える
0

tan(角度) = 反対/隣接

arctan(反対/隣接) = 角度

反対 = ay - by

隣接 = bx - ax

Math.Atan((a.Y - b.Y) / (b.X - a.X));
于 2012-11-19T17:34:53.083 に答える
0

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

ab

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

必要な角度は、Pi - angle(ab) です。

于 2012-11-19T17:36:02.927 に答える