0

次の関数は何を実行しますか?

    public static double CleanAngle(double angle) {

        while (angle < 0)
            angle += 2 * System.Math.PI;

        while (angle > 2 * System.Math.PI)
            angle -= 2 * System.Math.PI;

        return angle;
    }

これは、ATan2 での使用方法です。ATan2 に渡される実際の値は常に正であると思います。

  static void Main(string[] args) {
        int q = 1;
        //'x- and y-coordinates will always be positive values
        //'therefore, do i need to "clean"?
        foreach (Point  oPoint in new Point[] { new Point(8,20), new Point(-8,20), new Point(8,-20), new Point(-8,-20)}) {
            Debug.WriteLine(Math.Atan2(oPoint.Y, oPoint.X), "unclean " + q.ToString());
            Debug.WriteLine(CleanAngle(Math.Atan2(oPoint.Y, oPoint.X)), "cleaned " + q.ToString());                
            q++;
        }

        //'output
        //'unclean 1: 1.19028994968253
        //'cleaned 1: 1.19028994968253
        //'unclean 2: 1.95130270390726
        //'cleaned 2: 1.95130270390726
        //'unclean 3: -1.19028994968253
        //'cleaned 3: 5.09289535749705
        //'unclean 4: -1.95130270390726
        //'cleaned 4: 4.33188260327232

    }
アップデート

回答ありがとうございます。すべての答えに対して別の質問があります。

なぜ彼らは角度を「正規化」するのでしょうか? これがコードの一部です。

        double _theta = Math.ATan2(oEnd.Y - _start.Y, oEnd.X - _start.X);

        Point oCenter = new Point();
        oCenter.X = (int)(_start.X + _distanceTravelled * Math.Cos(_theta));
        oCenter.Y = (int)(_start.Y + _distanceTravelled * Math.Sin(_theta));

        //'move barrage
        this.Left = oCenter.X - this.Width / 2;
        this.Top = oCenter.Y - this.Height / 2;
4

4 に答える 4

2

ラジアン単位の角度を正規化して、間隔 に収まるようにします[0..2pi]2piは完全な円であるため、角度は角度、、...xに等しくなります。x+2pix+4pix+6pi

于 2010-04-09T07:39:57.083 に答える
1

次の機能は何を実行しますか?

これは、角度(ラジアン単位)を0から2πまで強制的に書き込む非常に遅い方法です。

なぜ彼らは角度を「正規化」しているのでしょうか?

なぜならATan()、-πとπの間の角度を返し、彼らはそれを0と2πの間で欲しかったからです。

それがを使用する唯一のコードである場合CleanAngle、IDのために必要ありません

Cos(θ) = Cos(θ-2π)  
Sin(θ) = Sin(θ-2π)
于 2010-04-09T22:59:39.633 に答える
1

このメソッドは、角度を範囲 0..pi*2 の同等の角度に変換します。

メソッドに正の値のみを渡すAtan2と、最初の象限の角度、つまり範囲 0..pi/2 のみが返されます。したがって、角度を正規化する必要はありません。

于 2010-04-09T07:45:01.320 に答える
0

ラジアンで測定された角度を 0 から 2 Pi の範囲に正規化します。

于 2010-04-09T07:40:25.663 に答える