簡體   English   中英

如何檢索兩個矢量3D之間的角度?

[英]How do I retrieve the angle between two vectors 3D?

我是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獲得相同的角度而不是更高。 當矢量的順序發生變化時,我想給我一個更大的角度。

使用功能可幫助您選擇所需的角度。 在代碼的開頭,寫:

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

您要問的是不可能的,因為包含角度的平面可以以兩種方式定向,輸入數據中沒有任何內容可以提供關於它的線索。

您所能做的就是計算向量之間的最小角度(或其向360°的補充),並且交換向量不會產生影響。

點積在這里沒有罪,這是一個幾何死胡同。

如果您正在使用3D矢量,則可以使用toolbelt 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中簡單的想法是冗長或不透明的。

點積是可交換的,因此您必須使用不同的度量。 它不關心訂單。

由於點積是可交換的 ,因此簡單地顛倒將變量放入函數的順序將不起作用。

如果您的目標是找到鈍角(較大)角度而不是銳角(較小)角度,則從360度減去函數返回的值。 由於您似乎有一個關於何時需要切換變量的標准,因此您應該使用相同的標准來確定何時從360中減去找到的值。這將為您提供在這些情況下要查找的值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM