python Функция вычисления угла между векторами (градусы или радианы) -- пример на базе numpy

Можно вычислять так:

@staticmethod
def unitVector(vector):
	""" Returns the unit vector of the vector.  """
	return vector / np.linalg.norm(vector)

@staticmethod
def angleBetween(v1, v2, deg = True):
	""" Returns the angle in radians between vectors 'v1' and 'v2'::
	"""
	print('Первый вектор:', v1)
	print('Второй вектор:', v2)

	v1_u = MathCommon.unitVector(v1)
	v2_u = MathCommon.unitVector(v2)

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

	print('радианы:', result)
	if deg:
		result = np.degrees([radians.real])[0]  # переводим в градусы

	return result

Источники

  1. Реализовано на базе: https://stackoverflow.com/a/13849249

Key Words for FKN + antitotal forum (CS VSU):

vedro-compota's picture

Почему-то эта функция (выше) возвращает далеко не все углы для случайно генерируемых векторов.

Не очень ясно в чем тут смысл строки:

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

_____________
матфак вгу и остальная классика =)

moberaptor's picture

Как вариант, думаю, можно так сделать:

from math import sqrt, acos, degrees

x1 = 1
y1 = 0
z1 = 1

x2 = 0
y2 = 1
z2 = 0

def scalar(x1, y1, z1, x2, y2, z2):
    return x1*x2 + y1*y2 + z1*z2

def module(x, y, z):
    return sqrt(x ** 2 + y ** 2 + z ** 2)

cos = scalar(x1, y1, z1, x2, y2, z2)/(module(x1,y1,z1)*module(x2,y2,z2))

ang = acos(cos)

print(degrees(acos(cos)))

Тестовые данные