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

问题描述 投票:0回答:5

我是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
5个回答
11
投票

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

def angle(v1, v2, acute):
    # v1 is your first vector
    # v2 is your second vector
    angle = np.arccos(np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2)))
    if acute:
        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 degrees
print(180* angle(vec1, vec2, True)/np.pi) # 90 degrees
print(180* angle(vec2, vec1, False)/np.pi) # 270 degrees

10
投票

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


1
投票

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

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

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


0
投票

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


0
投票

由于点积是可交换的,因此简单地反转将变量放入函数中的顺序是行不通的。

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

© www.soinside.com 2019 - 2024. All rights reserved.