Угол между векторами - Python - PullRequest
       0

Угол между векторами - Python

0 голосов
/ 14 февраля 2020

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

Мои данные состоят из координат отслеживания глаз, поэтому я уверен, что должны быть отрицательные значения. Пример данных - {308, 394, 700, 738,6, 298,8}, {554, 718, 1270, 737,3, 352,5}, {300, 1314, 1612, 1014,3, 728,5}, {316, 1642, 1956, 844,5, 885,1} где первые 4 значения являются координатами (x1, x2, y1, y2). Код у меня есть:

def angle_between(v1, v2, deg=True):
""" Returns the angle in radians between vectors 'v1' and 'v2'::
"""
print('First vector:', v1)
print('Second vector:', v2)

v1_u = unit_vector(v1)
v2_u = unit_vector(v2)

radians = np.arccos(np.clip(np.dot(v1_u, v2_u), -1.0, 1.0))
result = radians

# print('radians:', result)
if deg:
    result = np.degrees([radians.real])[0] 
    print(f"degrees: {result}")
return result

Помогите мне, пожалуйста! (

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

Насколько я понимаю, функция arccos возвращает значения только от 0 до Pi, поэтому вы не найдете там отрицательных чисел.

0 голосов
/ 15 февраля 2020

Чтобы получить полный круг, используйте arctan2

radians = np.arctan2(np.cross(v1_u, v2_u), np.dot(v1_u, v2_u))

Этот подход дает угол, необходимый для поворота первого вектора, чтобы сделать то же направление, что и второй, поэтому он описывает взаимную ориентацию векторов ( например, что «левее» или против часовой стрелки)

0 голосов
/ 14 февраля 2020

На самом деле это не проблема кодирования, а математическая проблема. Не уверен, что это лучшее место для решения, я позволю кому-то более опытному стереть / удалить при необходимости.

Ar c cosinus дает вам число от 0 до пи, так что вы не можете надеяться получить ориентированный угол. Вам необходимо провести различие между отрицательным и положительным скалярным произведением.

Включите шаг за шагом 'go.

Давайте сначала определим следующую функцию, мы предполагаем, что v1 и v2 нормализованы для ради простоты

def angle(v1,v2):
    scalar_product = v1[0]*v2[0] + v2[1]*v2[1]
    return npy.arccos( scalar_product ) # result between 0 and pi

Если мы установим v1 = [ 1 , 0 ] и попробуем

angle( v1 , [ np.cos(2*np.pi/3) , np.sin(2*pi/3) )
angle( v1 , [ np.cos(4*np.pi/3) , np.sin(4*pi/3) )

У вас будет тот же результат, около 2,09, поэтому 2 * пи / 3. Поскольку 2 * pi / 3 и 4 * pi / 3 имеют одинаковое значение cos, вы не можете получить разницу.

Поэтому нам нужна информация из определителя матрицы, составленной из двух векторов, для определения ориентации , Вы можете использовать np.linalg.det для матрицы, которую вы строите с двумя векторами. Если определитель положительный, вы сохраняете угол, который вы нашли, с помощью угла функции, иначе вы берете противоположное. Должен сделать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...