如何获取两个三维向量之间的夹角?

6
我是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获得的角度相同且不会更高。 我希望在向量顺序改变时获得更大的角度。


1
你已经决定如何确定要围绕哪个法线旋转了吗? - Ignacio Vazquez-Abrams
5个回答

11

使用函数来帮助你选择想要的角度。在你的代码开头,写下:

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

3
需要注意的一点是,如果v1v2完全共线,np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))可能会返回类似于1.0000000000000002的值。在这种情况下,np.arccos(...)将抛出一个不好看的运行时警告。可以通过使用np.arccos(np.clip(...,-1,1))来避免这个问题。 - Bastian

9

如果您正在处理三维向量,您可以使用工具包vg来简洁地完成此操作。它是建立在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)

我在我的上一家创业公司创建了这个库,它的动机来自于像这样的应用场景:使用NumPy时,有些简单的想法可能会变得冗长或不透明。


快速测试了一下,这非常有用。我至少使用过的东西并不是非常花哨,但正如文档所说 - 我不想编写一个函数来规范化向量,然后计算角度等等...很高兴能够用它来原型设计。如果需要,我随时可以重新实现/优化。喜欢它。 - logicOnAbstractions

1
你所要求的是不可能的,因为包含角度的平面可以有两种方向,而输入数据中没有任何线索。
你所能做的就是计算向量之间的最小角度(或其补角到360度),交换向量不会产生影响。
点积在这里并不起作用,这是一个几何死胡同。

0
点积是可交换的,因此您需要使用不同的度量标准。它不关心顺序。

0

由于点积是交换律,所以简单地反转将变量放入函数的顺序是行不通的。

如果您的目标是找到钝角(较大的角度)而不是锐角(较小的角度),请从360度中减去函数返回的值。由于您似乎有一个切换变量的标准,您应该使用相同的标准来确定何时从360中减去找到的值。这将在这些情况下为您提供所需的值。


是的,但如何在Python程序中自动化该过程,我不知道。这是计算一个点是否在具有三维空间顶点的多边形内的主要程序的一部分。一个定理表明,由点和顶点生成的向量之间的角度之和= n * 360度。 - Alberto Alarcon Paredes
1
你说过你要交换向量的顺序,这样做的目的是什么?在什么情况下你会想要交换这些向量?回答这些问题将有助于我帮助你。 - William Walker
@AlbertoAlarconParedes 你指的是哪个定理?一个多边形的内角和为180*(n-2)度。 - ijustlovemath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接