如何检索两个向量3D之间的角度?

Alb*_*des 2 python numpy computational-geometry python-2.7

我是python的新手。我在3d空间中有两个向量,我想知道两个之间的角度

我试过了:

vec1=[x1,y1,z1]

vec2=[x2,y2,z2]

angle=np.arccos(np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2)))
Run Code Online (Sandbox Code Playgroud)

但是当更改顺序时,vec2,vec1获得相同的角度,并且不更高。当向量的顺序改变时,我想给我更大的角度。

Art*_*hur 6

使用功能可以帮助您选择所需的角度。在代码的开头,写:

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
Run Code Online (Sandbox Code Playgroud)

然后,当您想在程序中计算角度(以弧度为单位)时,只需编写

angle(vec1, vec2, 'True')
Run Code Online (Sandbox Code Playgroud)

用于锐角,以及

angle(vec2, vec1, 'False')
Run Code Online (Sandbox Code Playgroud)

钝角。

例如:

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
Run Code Online (Sandbox Code Playgroud)

  • 需要注意的一件事是,如果“v1”,“np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))”可能会返回类似“1.0000000000000002”的内容和“v2”完全共线。在这种情况下,“np.arccos(...)”将抛出一个丑陋的运行时警告。可以通过使用`np.arccos(np.clip(...,-1,1))`来避免这个问题 (3认同)

pau*_*kow 6

如果您正在使用 3D 矢量,您可以使用工具带vg简洁地完成此操作。它是 numpy 顶部的一个浅层。

import numpy as np
import vg

vec1 = np.array([x1, y1, z1])
vec2 = np.array([x2, y2, z2])

vg.angle(vec1, vec2)
Run Code Online (Sandbox Code Playgroud)

您还可以指定视角以通过投影计算角度:

vg.angle(vec1, vec2, look=vg.basis.z)
Run Code Online (Sandbox Code Playgroud)

或通过投影计算有符号角:

vg.signed_angle(vec1, vec2, look=vg.basis.z)
Run Code Online (Sandbox Code Playgroud)

我在上次创业时创建了这个库,它的动机是这样的用途:在 NumPy 中冗长或不透明的简单想法。


iju*_*ath 0

点积是可交换的,因此您必须使用不同的度量。它不关心顺序。