Подтвердить что ты не робот

Угол между двумя точками, 0-360, CW?

Я знаю, что этот вопрос задавали тысячу раз, но для жизни я не могу найти ответ, который мне нужен. Я хочу найти угол (от 0 до 360 градусов, вращающийся по часовой стрелке) между 0,1 и другой точкой (на следующей диаграмме, 0.3,-0.17), с началом в 0,0. Вот несколько грубо нарисованная (свободная) иллюстрация того, что мне нужно:

custom atanfull

Круг слева - это чисто для того, чтобы показать, в каком направлении я хочу, чтобы углы вращались и откуда они начинались/заканчивались. Рисунок справа дает пример ввода, который я бы подавал на код (т.е. 0.3,-0.17). Зеленая линия - это угол.

Причина, которую я задаю здесь, а не MathExchange, заключается в том, что моя проблема является непосредственно программной; то есть мой вопрос заключается в следующем: как найти угол между двумя точками, как описано выше, на языке программирования, таком как С++ или JavaScript? Кроме того, причина, по которой я не указываю конкретный язык, состоит в том, что я знаю многих и способен конвертировать любой из них, что побуждает больше людей публиковать потенциально правильный ответ; это полезно для меня и для всех, кто придет за мной и найдет этот вопрос.

4b9b3361

Ответ 1

Функция atan2 дает угол точки относительно оси X, учитывая координаты точки x и y. Результат обычно варьируется от -180 до 180 градусов, но мы можем настроить его на [0, 360] позже.

Вы можете найти угол между двумя линиями A и B, которые простираются от начала координат, вычитая их результаты atan:

angle = atan2(a.y, a.x) - atan2(b.y, b.x);

Здесь ваша точка A будет (0,1), а ваша точка B будет (0,3, -0,17).

atan2 обычно возвращает угол в радианах, а не градусах (обязательно проверьте документацию на языке). Если это так, вы должны преобразовать его в градусы здесь.

angle = angle * 360 / (2*pi);

angle теперь будет находиться где-то между -360 и 360 градусов, поэтому вам нужно выполнить дополнительную проверку, чтобы получить ее в нужном диапазоне.

if (angle < 0){
    angle = angle + 360;
}

Ответ 2

Если вы переворачиваете изображение по диагонали, т.е. обмениваете координаты x и y, распределение углов является обычным для тригонометрии. Таким образом,

angle_in_degrees=atan2(x,y)*180/pi

плюс любые поправки для диапазона, если вы не хотите [-180 °..180 °].