2013-07-10 7 views
4

Я борюсь с этим в JavaScript, но эта проблема относится ко многим другим языкам и средам.Как использовать atan2() в сочетании с другими системами Radian angle

Я хочу иметь один объект вращающийся к позиции другого объекта, и я использую:

atan2(obj1.dy, obj1.dx) - obj2.getRotation()

, чтобы проверить, если второй объект должен вращаться по часовой стрелке или против часовой стрелки, в данный момент времени.

В KineticJS, среде программирования JS/HTML5/Canvas, которую я использую, угол указан в радианах от 0 до 2 pi, начиная с положительной оси Y и идя по часовой стрелке. Такое поведение наблюдается и во многих других средах программирования.

Однако при расчете угла движения от второго объекта с Math.atan2 (у, х) функции, угол задаются от -pi пи, начиная с положительной осью X, происходит против часовой стрелки.

Для уточнения:

Difference between normal radians and atan2()

Вопрос:

Как я могу вычислить угол в нормальных радианах от результата функции atan2()?

+1

_ «В Javascript/HTML5/Canvas (как и во многих других средах программирования) угол задается в радианах от 0 до 2 пи, начиная с положительной оси Y и идя по часовой стрелке.» _ Вы уверены, что это является ли соглашение, указанное языком, а не вашей собственной базой кода? В прошлый раз, когда я использовал холст, я предположил, что радианы начали с положительной оси X и двигались против часовой стрелки, и все работало так, как я ожидал. – Kevin

+1

Кевин, возможно, вы правы. Действительно, я использую KineticJS для своего текущего приложения, которое ведет себя так, как я заявлял. Я не уверен, как это соглашение указано в исходном контексте холста. Спасибо, что указали это, я отредактирую его. – Qqwy

ответ

2

Если вы хотите, чтобы угол увеличить по часовой стрелке от 0 по оси у, вычислить угол в atan2 (х, у). Это, однако, дает отрицательные углы для x < 0, поэтому вы должны добавить 2 * pi в этом случае.

2

Значения одинаковы в обоих случаях по модулю 2*PI и с настройкой для различных соглашений о знаках и смещениях. Псевдо-код:

theta = 0.5*M_PI - atan2(y, x); // adjust for required sign/offset 
theta = fmod(theta, 2.0*M_PI); // make result modulo 2*PI 
+0

Это кажется правильным, но ответ по-прежнему ориентирован против часовой стрелки и поворачивается на .5pi rad – Qqwy

+0

Пропустил эту часть, извините - теперь обновил ответ, чтобы покрыть это. –

1

Если ваш результат находится между 0 и Pi, результат получается довольно прямолинейным. Если ваш результат находится между -Pi и 0, добавьте 2 * Pi к вашему результату, таким образом вы получите результат в интервале 0, 2 * Pi.

Конечно, было бы неплохо, если бы вы реализовали отдельную функцию для этого типа преобразования, чтобы не дублировать ваш код время от времени.