如何近似矢量旋转

时间:2012-11-01 16:32:07

标签: java vector rotation double sin

我有一个以速度V(vectorX,vectorY)移动的点。最初V =(1,0)。 我使用以下方法反复旋转它:

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

旋转不应调整矢量长度。但是这个解决方案会减少我的矢量长度:

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

我知道sin和cos函数给出了近似的结果。但为什么我的长度会减少呢?它是如何解决的?

1 个答案:

答案 0 :(得分:2)

欢迎来到非精确浮点运算的世界。你失去了精确度。这是生活中的事实。

您可能应该以增加的角度旋转初始固定矢量。

即:

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

这样你就不会累积精确度损失。