簡體   English   中英

將NumPy用於3D矢量

[英]Use NumPy for 3D vectors

我必須承認,我在Python上並不差,但是在數學上卻不那么好。 在那里,我說了。 我正計划用3D坐標系構建游戲。 經典,真的很簡單。 就像我的第一個房間是0、0、0,而東方的房間是1、0、0。

更加困難的是,我需要搜索這些坐標。 舉例來說,找出以3個房間為半徑的X,Y,Z坐標周圍的所有房間。 我也可以將其用於尋路。 所以我在考慮使用NumPy來提高性能(因為我不知道最后會有多少個坐標),所以事情很簡單:

import numpy as np
a = np.array([0.0, 0.0, 0.0])
b = np.array([1.0, 0.0, 0.0])

但這就是我微薄的技能達到死胡同的地方。 從理論上講,我可以將兩者相減以獲得絕對距離,但即使如此,它似乎還是卡住了。 所以我將我的需求放在這里...並希望有人可以幫助我解決問題:

  1. 返回兩個向量之間的距離(以int或float更好)。
  2. 尋找接近另一個的向量:接近的概念是一個距離,因此從理論上講,這意味着瀏覽所有向量並使其與另一個向量保持距離。 我不知道它在性能方面是否很棒。
  3. 獲得2D方向(在A和B之間的度數或輻射度)和垂直方向(相同的東西,但使用Z坐標)。
  4. “旋轉”矢量,保持其距離(范數)但沿不同的方向,這意味着繞Z軸樞轉(如果可行)。 圍繞X或Y旋轉的同一件事會很棒。
  5. 歸一化此向量,因此它將在相同的“方向”上,但與0,0,0,的距離(范數)僅為1。

很抱歉,如果這沒有太大意義。 我的用例在我的腦海中非常清楚,但是對向量的了解卻很少,也許我缺少一個或多個簡單的概念。

謝謝你的幫助!

一點線性代數將對您完成大部分所需的工作大有幫助。

  1. 兩個向量之間的距離。 您可以定義c = a- b ,然后找到該差矢量的大小。 查找向量的大小很簡單: mag = np.sqrt(np.dot(c,c))

  2. 現在您已經有了計算兩個點之間的距離的方法,盡管檢查每個可能的向量對都是O(N ^ 2),但是您可以執行建議的操作。

  3. 我不太確定2D方向和垂直方向是什么意思。 但是,可以使用以下事實來找到兩個向量之間的夾角:A點B = | A | * | B | * cos(theta),其中| A | 是A的大小,θ是角度。 因此,您可以執行以下操作:

    magA = np.sqrt(np.dot(A,A)) magB = np.sqrt(np.dot(B,B)) angle = np.arccos(np.dot(A,B)/(magA*magB))

  4. 這就是旋轉矩陣的作用。 給定一個角度,您可以定義一個旋轉矩陣M,然后簡單地使用np.dot(M, A)來獲得旋轉矢量。

  5. 要歸一化向量,只需將每個分量除以幅度即可。 所以normA = A / (np.sqrt(np.dot(A,A))

這不是一個完整的答案,但希望它能引導您朝正確的方向發展。

暫無
暫無

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

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