Помогите понять функцию - PullRequest
0 голосов
/ 09 апреля 2010

Что выполняет следующая функция?

    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 ]

2 голосов
/ 09 апреля 2010

Он нормирует угол в радианах , так что он находится в интервале [0..2pi]. 2pi - полный круг, поэтому угол x равен углам x+2pi, x+4pi, x+6pi ...

1 голос
/ 10 апреля 2010

Что выполняет следующая функция?

Это очень медленный способ заставить угол (в радианах) записываться от 0 до 2π

Почему они "нормализуют" угол?

Потому что ATan() возвращает угол между -π и π, и они хотели, чтобы он был между 0 и 2π.

Если это единственный код, который использует CleanAngle, то он не нужен из-за идентичности

Cos(θ) = Cos(θ-2π)  
Sin(θ) = Sin(θ-2π)
1 голос
/ 09 апреля 2010

Метод преобразует угол в эквивалентный угол в диапазоне 0..pi * 2.

Если вы передаете только положительные значения в метод Atan2, вы получаете только угол для первого квадранта, то есть в диапазоне 0..pi / 2. Таким образом, вам не нужно нормализовать угол.

0 голосов
/ 09 апреля 2010

Нормализует угол, измеренный в радианах, в диапазоне от 0 до 2 Пи.

...