我头疼了几个小时试图弄清楚我的旋转算法出了什么问题,最后我发现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);
因此,将计算结果订阅到未在等式右侧使用的新变量可以解决问题。现在......有人能解释我在这里发生了什么吗?
答案 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
保持一致。