两个矢量3D之间的角度?蟒

时间:2016-09-14 18:41:15

标签: python python-2.7 numpy computational-geometry

我是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)))

但是当改变顺序时,vec2,vec1获得相同的角度而不是更高。 当矢量的顺序发生变化时,我想给我一个更大的角度。

5 个答案:

答案 0 :(得分:5)

使用功能帮助您选择所需的角度。在开始编写代码时,请写下:

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

答案 1 :(得分:1)

你要问的是不可能的,因为包含角度的平面可以有两种方向,输入数据中没有任何内容可以提供关于它的线索。

您所能做的就是计算向量之间的最小角度(或其向360°的补充),并且交换向量不会产生影响。

点积在这里无罪,这是一个几何死胡同。

答案 2 :(得分:0)

点积是可交换的,因此您必须使用不同的指标。它不关心订单。

答案 3 :(得分:0)

由于点积为commutative,因此简单地颠倒将变量放入函数的顺序将不起作用。

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

答案 4 :(得分:0)

如果您正在使用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)

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

vg.angle(vec1, vec2, look=vg.basis.z)

或通过投影计算符号角:

vg.signed_angle(vec1, vec2, look=vg.basis.z)

我在上次启动时创建了该库,它的使用动机如下:在NumPy中冗长或不透明的简单想法。