我有一个以速度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函数给出了近似的结果。但为什么我的长度会减少呢?它是如何解决的?
答案 0 :(得分:2)
欢迎来到非精确浮点运算的世界。你失去了精确度。这是生活中的事实。
您可能应该以增加的角度旋转初始固定矢量。
即:
angle = angle + radianAngle;
vectorX = initialVectorX * Math.cos(angle) - initialVectorY * Math.sin(angle);
vectorY = initialVectorX * Math.sin(angle) + initialVectorY * Math.cos(angle);
这样你就不会累积精确度损失。