2014-07-09 2 views
0

У меня была головная боль в течение нескольких часов, пытаясь выяснить, что случилось в моем алгоритме вращения и, наконец, я узнал, что была проблема в Java интерпретации таких расчетов:Java расчеты Wierd

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); 

Так подписавшись результатом вычисления в новом переменный, не используется в правой части уравнения решает проблему , Теперь ... может кто-нибудь объяснить мне, что здесь происходит?

ответ

4

При вычислении playerCenterY используется модифицированный playerCenterX. А во второй версии вы используете нетронутые значения.

+0

Ох дерьмо ... теперь так больно узнать правду ... спасибо, что указали это для меня – Savail

+1

Трудно, когда вы долго работаете над проблемой, чтобы найти ошибку, где вы не ожидаете это :) Добро пожаловать. – mkrakhin

+1

@Savail, не волнуйтесь. мы все были там. –

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, которые вы ожидали быть 248.0f

И во втором вы присваиваете значение отдельной переменной, поэтому значение playerCenterX не изменяется и остается таким же, как 248.0f.