Угол между двумя точками, 0-360, CW?
Я знаю, что этот вопрос задавали тысячу раз, но для жизни я не могу найти ответ, который мне нужен. Я хочу найти угол (от 0 до 360 градусов, вращающийся по часовой стрелке) между 0,1
и другой точкой (на следующей диаграмме, 0.3,-0.17
), с началом в 0,0
. Вот несколько грубо нарисованная (свободная) иллюстрация того, что мне нужно:
![custom atanfull]()
Круг слева - это чисто для того, чтобы показать, в каком направлении я хочу, чтобы углы вращались и откуда они начинались/заканчивались. Рисунок справа дает пример ввода, который я бы подавал на код (т.е. 0.3,-0.17
). Зеленая линия - это угол.
Причина, которую я задаю здесь, а не MathExchange, заключается в том, что моя проблема является непосредственно программной; то есть мой вопрос заключается в следующем: как найти угол между двумя точками, как описано выше, на языке программирования, таком как С++ или JavaScript? Кроме того, причина, по которой я не указываю конкретный язык, состоит в том, что я знаю многих и способен конвертировать любой из них, что побуждает больше людей публиковать потенциально правильный ответ; это полезно для меня и для всех, кто придет за мной и найдет этот вопрос.
Ответы
Ответ 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 °].