【问题标题】:How to approximate vector rotation如何近似矢量旋转
【发布时间】:2012-10-22 07:12:36
【问题描述】:

我有一个以速度 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 函数给出了近似的结果。但是为什么我的长度会变短呢?以及如何解决?

【问题讨论】:

    标签: java vector rotation double trigonometry


    【解决方案1】:

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

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

    即:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多