Как нормализовать угол между -π и π Java

У меня проблемы с получением нормализованного плавания для плавного вращения некоторых спрайтов. Я использую интерполяцию для поворота спрайтов. В определенный момент вращения спрайт будет прыгать каждый раз в одном и том же месте.

name.angle = (name.getBody().getTransform().getRotation() * alpha + name.prevAngle * (1.0f - alpha));

Я посмотрел в Интернете и нашел пару способов нормализовать угол между -pi и +pi, но я не могу заставить их работать в моей ситуации.

Следующее не работает

if (name.angle > Math.PI)
    name.angle += 2 * Math.PI;
else if (name.angle < -Math.PI)
    name.angle -= 2 * Math.PI;

Следующее работает

name.angle = name.angle < 0 ? MathUtils.PI2 - (-name.angle % MathUtils.PI2) : name.angle % MathUtils.PI2;

person blockay    schedule 06.03.2015    source источник
comment
У вас свои плюсы и минусы наоборот.   -  person user207421    schedule 07.03.2015
comment
Я уверен, лол, спасибо за помощь всем. В следующий раз постараюсь не совершать такой глупой ошибки. Но у меня все еще проблемы с прыжками спрайта.   -  person blockay    schedule 07.03.2015
comment
Возможный дубликат Стандартный способ нормализации угол +/- π радиан в Java   -  person David Moles    schedule 14.06.2017


Ответы (1)


В своем первом фрагменте кода вы пишете

if (name.angle > Math.PI)
    name.angle += 2 * Math.PI;

Это говорит: «Если name.angle слишком большой, сделайте его больше». Я исправил это, изменив += на -= (и изменив -= на += в следующем бите). Я также заменил if на while. Таким образом, он по-прежнему будет работать, если начальный угол больше или меньше, чем на 2 пи. Правильный код:

double pi = Math.PI;
while (angle > pi)
    angle -= 2 * pi;
while (angle < -pi)
    angle += 2 * pi;
person Paul Boddington    schedule 06.03.2015
comment
О, чувак, какая небрежная ошибка. спасибо, что поправили меня. Но у меня все еще проблемы с прыжками спрайта. Это линия, которую я использую для интерполяции поворота name.angle = (name.getBody().getTransform().getRotation() * alpha + name.prevAngle * (1.0f - alpha)); Кроме того, я просто установил для спрайта интерполированное вращение и положение. Я попытался установить происхождение спрайта в центр, но это ничего не изменило. - person blockay; 07.03.2015