2011-11-18 72 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

相关问题