В языке программирования (Python, C # и т. Д.) Мне нужно определить, как рассчитать угол между линией и горизонтальной осью?
Я думаю, что изображение лучше всего описывает то, что я хочу:
Учитывая (P1 x , P1 y ) и (P2 x , P2 y ), как лучше всего рассчитать этот угол? Источник находится в вершине, и используется только положительный квадрант.
c#
python
trigonometry
orlp
источник
источник
Ответы:
Сначала найдите разницу между начальной точкой и конечной точкой (здесь это скорее направленный отрезок, а не «линия», поскольку линии простираются бесконечно и не начинаются в определенной точке).
Затем рассчитайте угол (который проходит от положительной оси X в
P1
к положительной оси Y вP1
).Но
arctan
может не быть идеальным, потому что разделение различий таким образом сотрет различие, необходимое, чтобы различить, в каком квадранте находится угол (см. Ниже). Вместо этого используйте следующее, если ваш язык включаетatan2
функцию:РЕДАКТИРОВАТЬ (22 февраля 2017 г.): В целом, однако, призыв
atan2(deltaY,deltaX)
только для того, чтобы получить правильный уголcos
иsin
может быть не элегантным. В этих случаях вы часто можете сделать следующее:(deltaX, deltaY)
как вектор.deltaX
иdeltaY
на длину вектора (sqrt(deltaX*deltaX+deltaY*deltaY)
), если длина не равна 0.deltaX
теперь будет косинус угла между вектором и горизонтальной осью (в направлении от положительного X к положительной оси Y вP1
).deltaY
теперь будет синусом этого угла.РЕДАКТИРОВАТЬ (28 февраля 2017 г.): Даже без нормализации
(deltaX, deltaY)
:deltaX
покажет вам, является ли косинус, описанный в шаге 3, положительным или отрицательным.deltaY
покажет вам, является ли синус, описанный в шаге 4, положительным или отрицательным.deltaX
иdeltaY
скажут вам, в каком квадранте находится угол, относительно положительной оси X вP1
:+deltaX
,+deltaY
От 0 до 90 градусов.-deltaX
,+deltaY
: От 90 до 180 градусов.-deltaX
,-deltaY
: От 180 до 270 градусов (от -180 до -90 градусов).+deltaX
,-deltaY
: От 270 до 360 градусов (от -90 до 0 градусов).Реализация на Python с использованием радианов (предоставлена 19 июля 2015 г. Эриком Лещинским, который редактировал мой ответ):
Все тесты проходят. Смотрите https://en.wikipedia.org/wiki/Unit_circle
источник
90 - angleInDegrees
?Извините, но я почти уверен, что ответ Питера неверен. Обратите внимание, что ось Y идет вниз по странице (обычно в графике). Таким образом, вычисление deltaY должно быть отменено, или вы получите неправильный ответ.
Рассматривать:
дает
Таким образом, если в приведенном выше примере P1 равен (1,1), а P2 равен (2,2) [поскольку Y увеличивается на странице], приведенный выше код даст 45,0 градуса для показанного примера, что неверно. Измените порядок расчета дельты, и он будет работать правильно.
источник
double arc = Math.atan2(mouse.y - obj.getPy(), mouse.x - obj.getPx()); degrees = Math.toDegrees(arc); if (degrees < 0) degrees += 360; else if (degrees > 360) degrees -= 360;
Я нашел решение в Python, которое работает хорошо!
источник
Учитывая точный вопрос, поместив нас в «специальную» систему координат, где положительная ось означает перемещение ВНИЗ (например, экран или вид интерфейса), вам нужно адаптировать эту функцию следующим образом, и отрицательные координаты Y:
Пример в Swift 2.0
Эта функция дает правильный ответ на вопрос. Ответ в радианах, поэтому использование углов обзора в градусах:
источник
На основе ссылки "Питер О" .. Вот версия Java
источник
функция Matlab:
источник
Формула для угла от 0 до 2pi.
Существует х = х2-х1 и у = у2-у1. Формула работает для
любое значение х и у. Для x = y = 0 результат не определен.
Р (х, у) = р () - пи () / 2 * (1 знак + (х)) * (1-знак (у ^ 2))
источник
источник
тестирование
Для тестирования я позволю гипотезе генерировать контрольные примеры.
источник