Я хочу начать с нуля, чтобы убедиться, что я понимаю, что вы просите.
Таким образом, для параметра
approach()
параметр «ток» обозначает текущий угол. Параметр «цель» указывает желаемый угол. Параметр «delta» указывает время (предполагая секунды), что угол должен достигнуть «цели».
Теперь, чтобы рассчитать кратчайший путь к углу вы можете просто сделать что-то вроде этого:
if(current + (360 - goal) <= 180) // If goal is 180° away it will rotate to the right automatically.
// ... Rotate to the right
else
// ... Rotate to the left
Мы можем проверить, что на самом деле работает, потому что если мы примем ваши требуемые значения (текущего = 45, цель = 315) и выполнить расчет выше, мы должны повернуть направо.
45 + (360 - 315) <= 180
45 + 45 <= 180
90 <= 180, true.
We turn it right.
Теперь это всего лишь вопрос расчета количества вращения на основе дельта. Это довольно просто.
Я объявлю «totalAngle» в качестве переменной, чтобы отслеживать разницу между текущим углом и углом назначения. Я буду назначать эту переменную в блоках кода if/else. Я также объявляю логическое значение, чтобы помочь мне отслеживать, какое направление мне нужно повернуть.
boolean rotateRight;
float totalAngle;
if(current + (360 - goal) <= 180) {
totalAngle = current + (360 - goal);
rotateRight = true;
}
else {
totalAngle = goal - current;
rotateRight = false;
}
Теперь при условии, что она вращается один раз в секунду, я возьму totalAngle и разделить его на количество секунд, прошедших (ака параметра «дельта»). Затем я изменяю «текущий» параметр и возвращаю его.
current -= rotateRight ? (totalAngle/delta) : -(total/delta);
Конечным функция должна выглядеть следующим образом:
public static float approach(float current, float goal, float delta) {
boolean rotateRight;
float totalAngle;
if(current + (360 - goal) <= 180) {
totalAngle = current + (360 - goal);
rotateRight = true;
}
else {
totalAngle = goal - current;
rotateRight = false;
}
current -= rotateRight ? (totalAngle/delta) : -(totalAngle/delta);
return current;
}
Edit: Если кратчайший путь на самом деле самый длинный, предположим, что "ток - (360 - цель) < = 180" является левое вращение, а не правое & наоборот.
Спасибо! Это работает по большей части! Извините, что я не сделал функцию подхода() очень ясной. Дельта-параметр в функции фактически представляет собой количество градусов, которые я хочу вращать в направлении целевого угла. Однако для этой цели вам будет легко приспособиться. – ASasseCreations
Нет проблем! Рад, что смог помочь :) – Nepromine