Atan2(y,x) は -pi と pi の間の float を返します。2 つの角度の間の距離を計算したいのですが、非連続性が原因でうまくいきません。
角度 1 と角度 2 の間の距離を計算できるようにしたいです。
これの要点は、中心から指定された角度まで円錐を作成できることです。基本的に私は評価します:
if(DistanceFromAngle1 < pi/4 [45°])
{
Angle2 is part of cone
}
距離が 2 つの交点を結ぶ直線を意味する場合、次のようにして距離を計算できます。
SQRT( ( ABS|cos(A) - cos(B)| )^2 + ( ABS|sin(A) - sin(B)| )^2 )
SQRT = 平方根
ABS = 絶対値
距離が角度の場合は、次のように計算します(疑似コード)
var angle = ABS(A - B)
if(angle > pi) angle = 2*pi - angle
return angle
dAngle1 = //convert angle1 to degrees
dAngle2 = // convert to degrees
delta = Math.Max(dAngle1, dAngle2) - Math.Min(dAngle1, dAngle2)
if (180 < delta) {
delta = 360 - delta;
}
// convert delta to radians if you want
π/2 は 45° ではなく 90° です。角度 2 が角度 1 を中心とする間隔にあり、角度 1 から両方向に 45° 離れているかどうかを知りたいと仮定します。
角度 2 と角度 1 の差を取り、差が [-π, π) になるまでモジュロ 2π を減らすことができます。これにより、角度 2 と角度 1 の間の符号付き距離が得られます。次に、これが (-π/4, π/4) 内にあるかどうかを確認します。atan2 によって返される値は常に -π と π の間にあるため、元の差は常に -2π と 2π の間にあるため、これらすべてを 1 つのチェックにまとめることができます。
if (angle2 - angle1 < -7π/4 ||
(angle2 - angle1 > -π/4 && angle2 - angle1 < π/4) ||
angle2 - angle1 > 7π/4)
{
angle2 is less than 45° away from angle1
}
編集:これが機能するかどうかはわかりません。divmod(radians, math.pi*2)[1]
いくつかのPythonコードから翻訳しましたが、がと同じ動作であるかどうかはわかりませんSystem.Math.IEEERemainder(radians, Math.PI*2.0)
。テストする必要があります...
EDIT2:%の使用は正しいと思います
EDIT3:ああ、それは負の数に対して負の値を返すので、それは正しくありません。誰かがC#でPython divmodを取得する方法を知っていますか?
2つの角度の間の角度を計算する方法:
public static double NormalizeAngle(double radians)
{
return fmod(radians,Math.PI*2.0); # this method doesn't exist, see above
}
public static double ArcLength(double radians1, double radians2)
{
radians1 = NormalizeAngle(radians1);
radians2 = NormalizeAngle(radians2);
return Math.Min(NormalizeAngle(radians1 - radians2, NormalizeAngle(radians2 - radians1));
}
それがどのように機能するかは、両方の方法を試し、すべての計算はmod 2piであり、距離が短い方を選択します。
別の解決策を示したいと思います。ベクトル演算を使用できます。これは、たとえば、開始点として2つのベクトルがある場合に役立ちます(これはあなたのケースのようです)。
2 つの正規化されたベクトルと が与えられるa
とb
、それらの間の角度は単純に になりacos(dot(a, b)) = acos(ax*bx + ay*by)
ます。
角度 から正規化されたベクトルを取得するには、たとえばalpha
を使用できます。a = vec2(cos(alpha), sin(alpha))
デノーマル ベクトルを正規化するには、 を使用しますna = a / length(a) = a / sqrt(dot(a, a))
。