Хорошо, если я не понял неправильно, у вас есть this._degrees
, который дает направление, в котором ваш объект указывает в настоящее время, в целочисленных градусах, нормализованный в пределах от 0 (включительно) до 360 (в или исключая?),И вы вычисляете направление, в котором объект должен указывать после поворота, как angleDegrees
.
Если я правильно понимаю, у вас есть ошибка знака в этом расчете, потому что соглашение для против часовой стрелки превращается в положительноеНаправление (но если ваша ось Y имеет 0 выше 1, это отменит, вы должны проверить и определить, является ли angleDegrees
таким, каким он должен быть или должен быть отрицан).
В любом случае, angleDegrees
указывает направление, в которое вы хотите повернуть, в диапазоне от -180 до 180 градусов.Нормализуйте его так, чтобы направление находилось в диапазоне от 0 до 360,
if (angleDegrees < 0) {
angleDegrees += 360;
}
Теперь, значение и направление поворота можно получить вычитанием,
int turn = angleDegrees - this._degrees;
Это значениележит между -360 и 360 градусов (точнее между -this._degrees
и angleDegrees
).И он может еще не дать кратчайшего поворота, если разница меньше -180 градусов или больше 180, это больше половины поворота, а другой путь будет короче, поэтому мы нормализуем еще раз,
if (turn < -180) {
turn += 360;
} else if (turn > 180) {
turn -= 360;
}
Теперь поворот лежит между -180 и 180 и дает кратчайший поворот в желаемом направлении.Если turn >= 0
, вы хотите повернуть по часовой стрелке, иначе против часовой стрелки
boolean clockwise = (turn >= 0);
, и теперь вам нужно только повернуть abs(turn)
градусов, например,
int amount = (turn < 0) ? (-turn) : turn;
for(int i = 0; i < amount; ++i) {
RotateItem(clockwise);
}