2016-09-14 339 views
1

我是新的python。 我在3D空间中的两个向量,我想知道我尝试了两种两个向量3D之间的角度? python

之间的角度:

vec1=[x1,y1,z1] 

vec2=[x2,y2,z2] 

angle=np.arccos(np.dot(vec1,vec2)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))) 

但是当更改顺序,VEC 2,VEC 1获得同样的角度,没有更高。 当矢量的顺序改变时,我想给我一个更大的角度。

+1

你决定如何找出你要绕其正常吗? –

回答

0

点积是可交换的,所以您必须使用不同的度量。它不关心订单。

0

由于点积是commutative,只需将您将变量放入函数的顺序颠倒过来即可。

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

+0

是的,但如何自动化在python程序中的进程,我没有想法。这是一个计算一个点是否在空间内具有顶点的poligone的主程序的一部分。一个热门话说,为该点和顶点生成的向量之间的角度的增加是= n * 360度。 –

+1

你在说你正在切换矢量的顺序。这是什么预期的结果?在什么情况下你想切换这些向量?回答这些问题将帮助我帮助你。 –

+0

@AlbertoAlarconParedes你提到哪个定理?多边形的总内角为180 *(n-2)度。 – ijustlovemath

1

你所问的是不可能的,因为包含该角度的平面可以以两种方式定向,输入数据中没有任何东西给出关于它的线索。

您只需计算向量之间的最小角度(或其与360°的互补),并交换向量不会产生任何效果。

点积在这里没有内疚,这是一个几何死角。

1

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

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 
相关问题