Как рассчитать угол, используя NumPy? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть x и y пиксельные координаты, которые я использую для вычисления углов. Первоначально я использовал подход math.atan2, но он дал мне некоторые проблемы, когда я передавал свои данные как array. Поэтому сейчас я использую приведенный ниже код, но возвращаемые значения не находятся в ожидаемом диапазоне градусов. Что я делаю не так?

angle1 = np.arctan2(angle1_x, angle1_y)
angle2 = np.arctan2(angle2_x, angle2_y)
degrees = np.degrees(angle1 - angle2)

1 Ответ

0 голосов
/ 29 августа 2018

Кажется, вы пытаетесь найти угол между двумя точками (x1, y1) и (x2, y2). Для начала, как уже упоминалось в комментариях, у вас неправильные аргументы. Но даже тогда ваше текущее решение на самом деле не работает.

angle1 и angle2 могут находиться в любом месте в диапазоне [-pi, pi], поэтому давайте предположим, что они pi и -pi (хотя они и представляют одно и то же значение, это возможно из-за 0.0 и -0.0 это разные поплавки).

Это дает «разницу» в 2*pi, что не совсем то, что вы хотите. Если бы мы поменяли их, это было бы -2*pi. Таким образом, наши значения теперь находятся в диапазоне [-2*pi, 2*pi], что означает, что один и тот же ответ может быть представлен несколькими значениями. Как мы это исправим? Делая

angle_difference = (angle2 - angle1) % np.pi  # range == [0, 2*pi)

Вам нужно будет проделать немного больше работы, чтобы попасть в диапазон [-pi, pi].

angle_difference = angle_difference if angle_difference < np.pi else -2*np.pi + angle_difference

Есть еще один способ: https://math.stackexchange.com/questions/227014/find-the-angle-between-two-vectors

import numpy as np
from numpy.linalg import norm

v1 = np.array([x1, y1])
v2 = np.array([x2, y2])

angle_difference = np.arccos((v1 @ v2) / (norm(v1) * norm(v2)))  # in range [0, pi]

Однако, поскольку он симметричен, он не будет указывать направление угла.

...