【问题标题】:How do I retrieve the angle between two vectors 3D?如何检索两个向量 3D 之间的角度?
【发布时间】:2016-09-14 18:41:15
【问题描述】:

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

【问题讨论】:

  • 您决定如何确定要旋转的法线了吗?

标签: python python-2.7 numpy computational-geometry


【解决方案1】:

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

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

【讨论】:

  • 需要注意的一件事是,如果v1v2 完全共线,np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)) 可能会返回类似1.0000000000000002 的内容。在这种情况下,np.arccos(...) 将抛出一个丑陋的运行时警告。使用np.arccos(np.clip(...,-1,1)) 可以避免此问题
【解决方案2】:

如果您正在使用 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 中冗长或不透明的简单想法。

【讨论】:

  • 快速测试了它 - 这非常有用。我至少使用过的东西并没有什么特别花哨的东西,但正如文档所说 - 我不想编写一个函数来归一化向量,然后计算角度......很高兴能用它来制作原型东西。如果有什么需要的话,我可以在以后重新实现/优化,无论出于何种原因。爱它
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      由于点积是commutative,简单地颠倒将变量放入函数的顺序是行不通的。

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

      【讨论】:

      • 是的,但是如何在 python 程序中自动化该过程,我不知道。这是主程序的一部分,它计算一个点是否在那个 poligone 内,顶点在空间 3d 中。一个定理说,为点和顶点生成的向量之间的角度相加是=n*360度。
      • 您是说您正在切换向量的顺序。这样做的预期结果是什么?在什么情况下你想切换这些向量?回答这些问题将有助于我为您提供帮助。
      • @AlbertoAlarconParedes 您指的是哪个定理?多边形的总内角为 180*(n-2) 度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多