Как повернуть актера жестом щипка

Я пытаюсь повернуть актера, используя жест щипка. Актер на самом деле вращается, но бывают случаи, когда вращение «застревает». Я зарегистрировал deltaRotDeg (дельта поворота в градусах), и бывают случаи, когда значения прыгают. Например, он вращается на -42,25918 градусов, а затем подскочит до 317,7408 градусов. Я следил за математикой вращения здесь http://www.codeproject.com/Articles/319401/Simple-Gestures-on-Android

И вот мой код. Моя математика неверна или что-то не так в коде?

public ActorGestureListener gestureListener = new ActorGestureListener() {
 @Override
    public void pinch(InputEvent event, Vector2 initialPointer1, Vector2 initialPointer2, Vector2 pointer1, Vector2 pointer2)  {
        Actor actor = event.getListenerActor();
        if(actor.getName().equals("valve")){
            Vector2 a = initialPointer2.sub(initialPointer1);
            Vector2 b = pointer2.sub(pointer1);
            a = a.nor();
            b = b.nor();
            float deltaRot = (float)(Math.atan2(b.y,b.x) - Math.atan2(a.y,a.x));
            float deltaRotDeg = (float)((deltaRot*180)/Math.PI);
            world.getValve().rotate(deltaRotDeg);
        }
    }

person Romelio Tavas Jr.    schedule 01.02.2014    source источник
comment
Я не знаю, где именно ошибка, но я думаю, что это как-то связано с -42,25918° + 360° = 317,7408°.   -  person noone    schedule 01.02.2014


Ответы (1)


Заменять

float deltaRotDeg = (float)((deltaRot*180)/Math.PI);

с

float deltaRotDeg = (float)(((deltaRot*180)/Math.PI + 360) % 360);
person Tanmay Patil    schedule 01.02.2014
comment
Не предотвратит ли это отрицательный результат? - person noone; 02.02.2014
comment
Да, это было бы. В этом-то и дело. Держите угол от 0 до 360 ИЛИ от -180 до 180. Оба варианта в порядке. Ваш текущий код может сделать это от -360 до +360 и иметь резкие скачки. Если вы измените его, вы будете знать, где будут скачки. Удачи. - person Tanmay Patil; 02.02.2014