4

Atan2(y,x) は -pi と pi の間の float を返します。2 つの角度の間の距離を計算したいのですが、非連続性が原因でうまくいきません。

理解を深めるためにこれを参照してください。

角度 1 と角度 2 の間の距離を計算できるようにしたいです。

これの要点は、中心から指定された角度まで円錐を作成できることです。基本的に私は評価します:

if(DistanceFromAngle1 < pi/4 [45°])
{
  Angle2 is part of cone
}
4

6 に答える 6

6

距離が 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
于 2013-01-25T01:52:53.617 に答える
5
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
于 2013-01-25T00:57:19.380 に答える
1

π/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
 }
于 2013-01-25T00:12:17.720 に答える
0

編集:これが機能するかどうかはわかりません。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であり、距離が短い方を選択します。

于 2013-01-25T00:26:31.833 に答える
0

別の解決策を示したいと思います。ベクトル演算を使用できます。これは、たとえば、開始点として2つのベクトルがある場合に役立ちます(これはあなたのケースのようです)。

2 つの正規化されたベクトルと が与えられるab、それらの間の角度は単純に になり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))

于 2013-01-25T00:22:53.970 に答える