UniLecs #146. Прыгающий мяч

UniLecs #146. Прыгающий мяч

UniLecs

Задача: иногда программисту необходимо иметь дело не только с математикой, но и с физикой. Например, при создании игр. Давайте представим, что нам нужно смоделировать движение прыгающего мяча. Большинство игр привязывают сцены к реальному времени (т.к. мощность компьютера и видеокарт у всех разная, а реалистичность обычно важнее плавности). Поэтому и мы будем привязывать движение мяча ко времени.

Итак, нам дано:

  • высота H0 (в метрах), с которой мы будем бросать наш мяч;
  • скорость V0 (в м/с), которую мы задаём мячу в момент броска;
  • угол A0 (в градусах) относительно горизонта, под которым мы бросаем мяч (A0 = 0 означает бросок строго вправо, A0 = 90 – строго вверх, A0 = -90 – строго вниз, A0 = ±180 – влево);
  • текущее время T (в секундах) с момента броска.

Значения H0, V0 и T ≥ 0; A0 может быть любым. Все числа вещественные.

Найти: смещение X (по горизонтали вправо от точки броска) и высоту H расположения мяча в момент времени T. Точность ответа должна быть до 3-х знаков после запятой.

Упругость и деформацию мяча и земли, сопротивление воздуха и прочие параметры, влияющие на движение мяча, мы не учитываем (принимаем мяч абсолютно упругим). Учитываем лишь ускорение свободного падения g = 9.81 м/с.

Дополнительно: помимо расчётов X и H желающие могут рассчитать скорость V мяча и направление (угол A относительно горизонта) движения мяча в момент времени T, а также максимальную высоту, на которую поднимается мяч Hmax.

Примеры

1.   Входные данные: H0 = 10, V0 = 1, A0 = 90, T = 2.863.

Ответ: X = 0, H = 10; V = 1, A = 90, Hmax = 10.051.

2.   Входные данные: H0 = 0, V0 = 10, A0 = 60, T = 5.

Ответ: X = 25, H = 2.138; V = 7.619, A = -48.985, Hmax = 3.823.

Идея: Поскольку мы имеем дело с абсолютно упругим мячом и не учитываем влияние прочих параметров, мяч будет прыгать с одинаковой периодичностью (равномерно двигаясь по горизонтали, поднимаясь на одну и ту же высоту, ударяясь о землю и отскакивая от неё с одной и той же скоростью). Для расчётов нам достаточно использовать формулы равноускоренного движения.

Сначала переведём градусы в радианы:

Имея начальную скорость V0 и угол броска A0, найдём начальную скорость движения мяча вправо и вверх:

Период времени между ударами мяча о землю будет равен:

где VF – скорость в момент удара о землю:

Поскольку мяч может быть подброшен не только с земли, необходимо найти время от удара о землю до того момента, когда мяч окажется на высоте H0, под углом A0 и будет иметь скорость V0 (в т.ч. после следующего удара о землю):

Все эти вычисления достаточно произвести 1 раз, т.к. они не зависят от времени, прошедшего с момента броска.

Для вычисления текущего положения мяча необходимо найти время, прошедшее с момента последнего удара о землю:

(здесь mod – оператор получения остатка от деления вещественных чисел; важно не забыть включить проверку значения P на неравенство 0, иначе возникнет ошибка деления на 0).

Высота, на которой находится мяч в момент времени T:

Движение мяча по горизонтали равномерное и зависит только о времени:

Текущую скорость и угол движения мяча можно найти через текущую скорость по вертикали и горизонтали:

Находим V и A:

Мяч находится на максимальной высоте в момент времени P/2 после удара о землю:

Вот и всё! ☺


Реализация:

python
python

https://gist.github.com/unilecs/8b3d2dab06b6c6dd882d88bd12c1e2c0

Report Page