Проблема в расчете направления векторов
Пытаюсь написать функцию, которая будет рассчитывать корректный угол вектора относительно положительной оси ординат. Столкнулся с проблемой: к примеру между вектором, лежащем на оси y (0, 1) и вектором (2, 0) я получаю 90 градусов - и это правильно, то если найти угол между (0, 1) и (-2, 0) - тоже получится 90 градусов, с одной стороны это логично, потому что формула ищет кратчайший угол. Но мне требуется получить не 90, а 270 градусов, так как мне необходимо задавать точное направление на плоскости для объекта. Вот фрагмент моего кода:
def calculate_yaw(x1, y1, x2, y2):
null_vector = [[0, 0], [x1 - x2, y1 - y2]]
cos_alpha = null_vector[1][0] / math.sqrt(null_vector[1][0]**2 + null_vector[1][1]**2)
arc_cos_in_grad = math.degrees(math.acos(cos_alpha))
print(f"arccos: {arc_cos_in_grad}")
return arc_cos_in_grad
Сперва я конвертирую вектор в нулевой, затем нахожу косинус угла, а потом перевожу в градусы. Но из-за того, что я получаю кратчайший угол между вектором и осью - у меня возникает большая проблема. Может быть есть какая нибудь другая формула или мне нужно сделать 2 расчета, сначала относительно оси y, а потом оси x и отталкиваться от этих значений, попутно сравнивая их результаты ?
Ответы (1 шт):
Используйте atan2 чтобы восстановить направление вектора (null_vector). Дальше вам нужно будет привести результат в нужный диапазон:
import math
def direction(x, y):
return math.degrees(math.atan2(y, x))
def test(x, y):
print(x, y, direction(x, y))
test(1, 0)
test(1, 1)
test(0, 1)
test(-1, 1)
test(-1, 0)
test(-1, -1)
test(0, -1)
test(1, -1)
$ python directions.py 1 0 0.0 1 1 45.0 0 1 90.0 -1 1 135.0 -1 0 180.0 -1 -1 -135.0 0 -1 -90.0 1 -1 -45.0