[英]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.