Python 如何检索两个三维向量之间的角度?
我是python新手。 我在三维空间中有两个向量,我想知道两个向量之间的角度 我试过:Python 如何检索两个三维向量之间的角度?,python,python-2.7,numpy,computational-geometry,Python,Python 2.7,Numpy,Computational Geometry,我是python新手。 我在三维空间中有两个向量,我想知道两个向量之间的角度 我试过: vec1=[x1,y1,z1] vec2=[x2,y2,z2] angle=np.arccos(np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))) 但当改变顺序时,vec2,vec1获得相同的角度,而不是更高的角度。 当向量的顺序改变时,我想给我一个更大的角度。点积是可交换的,所以你必须使用不同的度量。它不关心顺序。因为点积是,简
vec1=[x1,y1,z1]
vec2=[x2,y2,z2]
angle=np.arccos(np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)))
但当改变顺序时,vec2,vec1获得相同的角度,而不是更高的角度。
当向量的顺序改变时,我想给我一个更大的角度。点积是可交换的,所以你必须使用不同的度量。它不关心顺序。因为点积是,简单地颠倒将变量放入函数的顺序将不起作用
如果您的目标是找到钝角(较大)而不是锐角(较小),请从360度中减去函数返回的值。由于您似乎有一个切换变量的标准,因此您应该使用相同的标准来确定何时从360减去找到的值。这将为您提供在这些情况下需要的价值 你所问的是不可能的,因为包含角度的平面可以有两种方向,并且输入数据中没有任何东西提供有关它的线索 您所能做的就是计算向量之间的最小角度(或其360°的补码),交换向量不会产生效果
点积在这里是无罪的,这是一个几何死胡同。使用一个函数来帮助您选择您想要的角度。在代码的开头,写下:
def angle(v1, v2, acute):
# v1 is your firsr vector
# v2 is your second vector
angle = np.arccos(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))
if (acute == True):
return angle
else:
return 2 * np.pi - angle
然后,当您想在程序中计算角度(弧度)时,只需编写
angle(vec1, vec2, 'True')
对于锐角,以及
angle(vec2, vec1, 'False')
对于钝角
例如:
vec1 = [1, -1, 0]
vec2 = [1, 1, 0]
#I am explicitly converting from radian to degree
print(180* angle(vec1, vec2, True)/np.pi) #90 degrees
print(180* angle(vec2, vec1, False)/np.pi) #270 degrees
如果使用三维矢量,可以使用工具带简洁地执行此操作。这是numpy顶部的一个轻层
import numpy as np
import vg
vec1 = np.array([x1, y1, z1])
vec2 = np.array([x2, y2, z2])
vg.angle(vec1, vec2)
您还可以指定视角以通过投影计算角度:
vg.angle(vec1, vec2, look=vg.basis.z)
vg.signed_angle(vec1, vec2, look=vg.basis.z)
或通过投影计算符号角度:
vg.angle(vec1, vec2, look=vg.basis.z)
vg.signed_angle(vec1, vec2, look=vg.basis.z)
我在上一次启动时创建了这个库,它的动机是这样的:简单的想法在NumPy中是冗长的或不透明的。是的,但是我不知道如何在python程序中自动化这个过程。这是主程序的一部分,用于计算点是否位于三维空间中顶点所在的点内。一个定理说,点和顶点的矢量之间的角度相加等于n*360度。你是说你在切换矢量的顺序。这样做的预期结果是什么?在什么情况下,您希望切换这些向量?回答这些问题将帮助我帮助你们。@AlbertoAlarconParedes你们指的是哪个定理?多边形的总内角为180*(n-2)度。您是否已决定如何确定要围绕哪个法线旋转?请快速测试-这非常有用。我用过的东西至少没什么特别的,但正如文档所说的——我不想写一个函数来规范化向量,然后计算角度,然后。。。。很高兴能用它来制作原型。如果有任何需要,无论出于何种原因,我可以在以后重新实施/优化。爱它