Как обнаружить повернутый радиан?

Я делаю LunarLander в C. Мой корабль вращается между PI/2 и -PI/2. И оборот на шаг равен PI/ 20. Мне нужен способ определить, когда мой корабль повернулся на 1 радиан. Итак, когда 1 радиан вращается, топливо уменьшается на 1 единицу.

Я подумал сначала перевести свой угол в градусы, а затем посмотреть, больше ли угол 57, потому что 1 радиан равен 57 градусам. Но я не мог написать это в своей программе, потому что идея неполная. Хотя это просто то, о чем я подумал, я думаю, что решение приходит с той стороны, сравните с теми 57-градусными

while(1)
//code
    case SDLK_RIGHT:
        angle += SHIP_ROTATION_PER_STEP;
        if(angle > (PI/2)){
            angle = (PI/2);
            break;
        }
        break;
    case SDLK_LEFT:
        angle -= SHIP_ROTATION_PER_STEP;
        if(angle < -(PI/2)){
            angle = -(PI/2);
            break;
        }
        break;  
//code
//during the while

Мне нужна идея, чтобы сравнить, если бы все, что двигало мой корабль, составляло 1 радиан. Если сумма оборотов за шаг больше 1 радиана. Но я не могу понять, как


person Renzo    schedule 24.07.2019    source источник
comment
Топливо расходуется одинаково при вращении в обе стороны. Считайте поворот аналогично углу, но в обоих случаях вверх.   -  person Yunnosch    schedule 24.07.2019
comment
Вы знаете, что каждый SHIP_ROTATION_PER_STEP есть PI/20. Таким образом, каждый шаг составляет 9 градусов. Таким образом, на каждом 7-м обороте корабль будет вращаться на 1 радиан (либо вперед/назад/или их комбинацию).   -  person David C. Rankin    schedule 24.07.2019
comment
Вы лучше посчитайте, сколько топлива потребляет SHIP_ROTATION_PER_STEP.   -  person Eugene Sh.    schedule 24.07.2019
comment
Скорее всего, вам следует отслеживать угол корабля и остаток топлива корабля отдельно. Когда корабль поворачивает на двадцатую часть радиана, увеличьте или уменьшите угол на двадцатую часть радиана и уменьшите оставшееся топливо на двадцатую часть единицы топлива. Кроме того, не удивляйтесь, если сумма чисел с плавающей запятой отличается от суммы, которую вы получили бы, используя действительные числа — будут небольшие ошибки округления, и топливо не упадет точно до нуля, но может упасть до чего-то вроде —. 00001 или +.00001 единиц топлива, и угол может иметь аналогичные отклонения.   -  person Eric Postpischil    schedule 24.07.2019
comment
Спасибо всем!   -  person Renzo    schedule 25.07.2019


Ответы (1)


Держите аккумулятор total_angle. Всякий раз, когда корабль вращается в любом направлении, добавьте абсолютное значение вращения. Предполагая, что ваши вращения имеют тип double с плавающей запятой, это означает следующее:

total_angle += fabs(angle); /* angle is the increment in angle */

Давайте предположим, что angle и total_angle просто измеряют радианы напрямую, а не какую-то масштабированную целочисленную версию или что-то в этом роде. В этом случае всякий раз, когда total_angle достигает или превышает 1.0, мы вычитаем единицу топлива. При этом из аккумулятора вычитаем 1.0:

if (total_angle >= 1.0) {
    fuel--;
    total_angle -= 1.0;
}

Мы предполагаем, что одно вращение не превышает одного радиана, иначе нам пришлось бы сделать это циклом while.

person Kaz    schedule 24.07.2019
comment
Я бы написал что-то вроде total_angle += fabs (old_angle - angle). - person Mathieu; 24.07.2019
comment
Отлично, я сделал это с идеей обоих. @Kaz Я пробовал по-твоему, но не получилось должным образом. Я использовал old_angle, который говорит Матье. Спасибо всем за комментарии - person Renzo; 25.07.2019
comment
@ArturoAguilarLopez Право; angle в моем псевдокоде относится не к текущей позиции, а к дельте обновления; что соответствует new_angle - old_angle. - person Kaz; 25.07.2019
comment
UV, но total_angle звучит неправильно, учитывая @Yunnosch. Возможно total_rotations? - person chux - Reinstate Monica; 25.07.2019