Java奇怪的计算

时间:2014-07-09 10:17:42

标签: java rotation

我头疼了几个小时试图弄清楚我的旋转算法出了什么问题,最后我发现java解释这样的计算存在问题:

float playerCenterX = 248.0f;
float playerCenterY = 248.0f;
playerCenterX = (float)((playerCenterX - (float)512) * Math.cos(angle) - (playerCenterY - (float)300) * Math.sin(angle) + (float)512);
playerCenterY = (float)((playerCenterX - (float)512) * Math.sin(angle) + (playerCenterY - (float)300) * Math.cos(angle) + (float)300);

上面的代码给出了非常意想不到的结果,而不是围绕指定角度旋转点(512,300),而是给出了形成无穷大符号的坐标(角度从0到2PI)。

现在这样一个看似不重要且无关紧要的小修改修复了上面的代码:

float playerCenterX = 248.0f;
float playerCenterY = 248.0f;
float playerCenterX2 = (float)((playerCenterX - (float)512) * Math.cos(angle) - (playerCenterY - (float)300) * Math.sin(angle) + (float)512);
float playerCenterY2 = (float)((playerCenterX - (float)512) * Math.sin(angle) + (playerCenterY - (float)300) * Math.cos(angle) + (float)300);

因此,将计算结果订阅到未在等式右侧使用的新变量可以解决问题。现在......有人能解释我在这里发生了什么吗?

2 个答案:

答案 0 :(得分:4)

当playerCenterY计算时,它使用修改后的playerCenterX。在第二个版本中,您使用原始值。

答案 1 :(得分:1)

因为早些时候您使用的是同一变量playerCenterX的修改后的值。

playerCenterX = (float)((playerCenterX - (float)512) * Math.cos(angle) - (playerCenterY - (float)300) * Math.sin(angle) + (float)512);
playerCenterY = (float)((playerCenterX - (float)512) * Math.sin(angle) + (playerCenterY - (float)300) * Math.cos(angle) + (float)300);

因此,在上面的代码中,我们可以说第一次将值设置为248.0f,然后对其进行修改,playerCenterY获得您期望playerCenterX的更新值{ {1}}

在第二部分中,您将值分配给单独的变量,因此248.0f的值不会更改,并且与playerCenterX保持一致。