Как переместить переменную угла к целевому углу кратчайшим путем

У моих игровых юнитов есть переменная угла и переменная targetAngle. Эти переменные находятся в диапазоне от 1 до 360 градусов.

Переменная угла всегда должна двигаться к переменной targetAngle.

Проблема в том, что это не происходит кратчайшим путем. Когда targetAngle равен 350 градусов, а текущий угол составляет всего 10 градусов, переменная должна двигаться только на 20 градусов, а не увеличиваться на 340 градусов, как сейчас.

Как заставить переменную угла двигаться к переменной targetAngle кратчайшим путем?

Живая демонстрация: http://jsfiddle.net/zNsbc/

var angle = 10;
var targetAngle = 350;

setInterval(function() {

    if ( angle > targetAngle ) {
        angle--;
    }
    else if ( angle < targetAngle ) {
        angle++;
    }    

    $("#angle").text(angle);

}, 10);

person Nick    schedule 19.06.2012    source источник


Ответы (1)


Вы должны понимать, что 360 — это то же самое, что и 0, поэтому вы можете сравнить угол с targetAngle, а также с targetAngle+360 и переместить его в направлении, к которому он ближе всего (рассмотрите также -360 для углов, близких к 0, и targetAngle, близких к 360)

Итак, ваш пример:

angle:            10
targetAngle:      350 (diff 340)
targetAngle+360:  710 (diff 700)
targetAngle-360: - 10 (diff  20)

угол ближе всего к targetAngle-360, поэтому вы должны уменьшить его, а не увеличивать.

Примечание: не забудьте указать абсолютное значение разницы

person Attila    schedule 19.06.2012
comment
@Etienne - вот лучшее представление того, что я имел в виду - person Attila; 19.06.2012
comment
Спасибо за ваш пример! К сожалению, это не работает должным образом (например, попробуйте угол 300). это еще немного - person Nick; 19.06.2012
comment
Я забыл некоторые случаи при первой попытке, вот новая версия с другим подходом (проверено под большим углом): jsfiddle.net/4Lehy/8 - person Etienne; 19.06.2012