2012-11-01 71 views
0

我有一個移動速度爲V(vectorX,vectorY)的點。最初V =(1,0)。 我反覆使用隨機角度旋轉它:如何近似向量旋轉

vectorX = vectorX * Math.cos(radianAngle) - vectorY * Math.sin(radianAngle);矢量Y =矢量X *數學公式(弧度角)+矢量Y * Math.cos(弧度角);

旋轉不應該調整矢量長度。但是,這種解決方案降低了我的向量長度加班:

0.9999999164020167
0.9989817245134542
0.9990928546670482
0.9990920078686215
0.9990307271300217
0.999 0.9990122314933966
0.9958140526821458
0.9953881407397223
0.9953002497794944
0.9953739080312035
0.9953762669739241
0.9951229086200286
0.9951022010798389
0.9950609497602859
0.9950608230271147
0.9948941861659032
0.9949385678072231

我知道正弦和餘弦函數近似給出結果。但爲什麼我的長度縮短?以及如何解決?

回答

2

歡迎來到非精確浮點運算的世界。你失去了精確度。這是生活中的事實。

您應該旋轉初始固定矢量,而不是增加角度。

即:

angle = angle + radianAngle; 
vectorX = initialVectorX * Math.cos(angle) - initialVectorY * Math.sin(angle); 
vectorY = initialVectorX * Math.sin(angle) + initialVectorY * Math.cos(angle); 

這樣你就不會積累精度損失。