2011-11-18 70 views
0

我有一個向量A,由角度和長度表示。我想添加向量B,更新原始的A.B來自一個查找表,所以它可以用任何方式表示,使得計算更容易。快速的方式就地更新一個向量與另一個向量

具體而言,A被定義正是如此:

uint16_t A_angle; // 0-65535 = 0-2π 
int16_t A_length; 

逼近的罰款。檢查溢出是沒有必要的。快速正弦/餘弦近似可用。

我能想到的最快方法是將B表示爲一個分量向量,將A轉換爲分量,將A和B相加,將結果轉換回角度/長度並替換A.(這需要增加一個快速asin/acos)

我不是特別擅長數學並想知道如果我錯過了一個更明智的方法嗎?

我主要是在尋找一個通用的方法,但關於C中有用的微優化的具體答案/評論也很有趣。

+0

如果您在笛卡爾座標系中進行大量計算,您是否考慮過將所有矢量存儲在笛卡爾座標系中,並且只能在開始和結束時將極座標轉換爲極座標。 –

+0

這是一個好點,我不斷評估。例如,通過常量旋轉矢量發生很多,需要極性。你的評論確實讓我覺得,在另一個操作需要A的笛卡兒值的同時,我可能能夠擠入此代碼(在代碼可讀性方面花費了一些代價)。這使得轉換回到唯一的一步。 – porgarmingduod

+0

雖然旋轉是極地的加法,但笛卡兒僅有4倍,這比cos/sin/acos/asin便宜很多。不過,我想這取決於你的確切的運營細分。 –

回答

2

如果您需要進行大量的疊加操作,可能會考慮將所有內容以笛卡爾座標存儲,而不是極座標。

Polar非常適合旋轉操作(和縮放,我猜),但堅持使用Cartesian(旋轉是四次乘法,見下文)可能會比使用cos/sin/acos/asin更便宜每次你想做矢量加法。當然,這取決於你案例中的操作分配。

僅供參考,在笛卡爾座標系的旋轉如下(見http://en.wikipedia.org/wiki/Rotation_matrix):

x' = x.cos(a) - y.sin(a) 
y' = x.sin(a) + y.cos(a) 

如果a已知時間提前,則cos(a)sin(a)可以預先計算。

+0

我知道「只有4個乘法」太好了,不能成立。但是,我可以近似或預先計算這些值。謝謝。 – porgarmingduod

+0

@porgarmingduod你的角度是'uint16_t',64K值並不多,如果你使用trig函數的話,預計算查找表會獲得很多 - 如果你不這樣做,那麼很少的'sin'等等無論如何都不會影響。 –

+0

CPU緩存不會批准查找表的大小:) – porgarmingduod

相關問題