可能重複:
Fast algorithm for polar -> cartesian conversion更快的數學OPS
我正在通過jvisualvm一些尋路代碼(這是一個有點慢),我發現的是,80%的時間被浪費在我的向量執行花了更具體的是轉換笛卡爾座標到極的一部分,
r = Math.sqrt((x * x) + (y * y));
t = Math.atan2(y,x);
是回到任何舊學校的伎倆,會讓我更多的表現?
可能重複:
Fast algorithm for polar -> cartesian conversion更快的數學OPS
我正在通過jvisualvm一些尋路代碼(這是一個有點慢),我發現的是,80%的時間被浪費在我的向量執行花了更具體的是轉換笛卡爾座標到極的一部分,
r = Math.sqrt((x * x) + (y * y));
t = Math.atan2(y,x);
是回到任何舊學校的伎倆,會讓我更多的表現?
在我的路徑發現算法的經驗中,問題不在於這些線條。
主要問題是「你稱這兩條線多少次?」
你應該研究你的路徑尋找算法。
無論如何,如果你想減少這些線路的延遲,也可能使預先計算表sqrt
和atan2
每個x
和y
。或者甚至是一個將每個(x,y)直接映射到(r,t)的表。
你應該考慮你是否真的需要使用Math.atan2()
。根據我的經驗,幾乎不需要實際角度的幾何計算;通過使用更自然的操作,您可以獲得更快,更簡單,更穩健的結果。
例如,如果您要計算兩個向量(比如,a
和b
)之間的角度,可以改爲經常使用的點積:
(a.x*b.x + a.y*b.y) = |a| |b| cos(angle)
和一種臀「跨產品」 :
(a.x*b.y - a.y*b.x) = |a| |b| sin(angle)
這種「跨產品」是特別有用,因爲符號告訴你哪個矢量a
載體的側b
點。
如果事實證明你真的做需要(通常爲人類可讀的輸出)的角度,這些值是輸入做出atan2()
裁縫。
@PaulTomblin但這是另一種方式...... – Alnitak