Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检索两个三维向量之间的角度?_Python_Python 2.7_Numpy_Computational Geometry - Fatal编程技术网

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获得相同的角度,而不是更高的角度。 当向量的顺序改变时,我想给我一个更大的角度。点积是可交换的,所以你必须使用不同的度量。它不关心顺序。因为点积是,简

我是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获得相同的角度,而不是更高的角度。
当向量的顺序改变时,我想给我一个更大的角度。

点积是可交换的,所以你必须使用不同的度量。它不关心顺序。

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


如果您的目标是找到钝角(较大)而不是锐角(较小),请从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)度。您是否已决定如何确定要围绕哪个法线旋转?请快速测试-这非常有用。我用过的东西至少没什么特别的,但正如文档所说的——我不想写一个函数来规范化向量,然后计算角度,然后。。。。很高兴能用它来制作原型。如果有任何需要,无论出于何种原因,我可以在以后重新实施/优化。爱它