• 8356
  • 4
  • 1
Нравится блог?
Подписывайтесь!

Понг. Расчет отражения мяча при соударении с поверхностью

Из истории видеоигр мы знаем, что Pong – это симулятор настольного тенниса: мячик двигается по экрану по линейной траектории и, если он ударяется о периметр игрового поля или об одну из нарисованных ракеток, его траектория изменяется в соответствии с углом столкновения. Эту траекторию, а также само перемещение мяча по этой траектории мы и будем сегодня рассчитывать. Как ни странно, для этого нам понадобятся знания из курса 7 класса средней школы (привет тем, кто считает, что математика нужна только учителям математики).

Траектория в соответствии с углом столкновения может рассчитываться разными способами. Я предлагаю такой: от центра ракетки мяч отражается с очень малым углом; чем дальше от центра, тем больше угол отражения. Если он ударился правее от центра, то и мяч будет отлетать в правую сторону, если левее, то в левую.

Рис. 1

Этот принцип будет соблюдаться и для всех стен периметра игрового поля, которое имеет размер 620x460.

Теперь нам нужно вывести формулу, которая будет определять точку, в которую отлетит мяч при соударении. Например,  мяч отпрыгивает от координаты [x1=1;y1=-5] (см. рис. 1), угол мы знаем (угол = x1*10). Чтобы получить координату [x2;y2], продолжим линию до пересеченья с осью Oy. Таким образом, мы получим два подобных друг другу треугольника. Нам известен катет и противолежащий угол, найдем длину стороны С1 (см. рис. 2):

C1=x1/tg(угол альфа).

Из свойств подобных треугольников известно, что отношение периметров и длин биссектрис, медиан, высот и серединных перпендикуляров равно коэффициенту подобия, а коэффициент подобия — число k, равное отношению сходственных сторон подобных треугольников. Итак, длина С2=(расстояние от y1 до y2)+C1; коэффициент подобия k=C2/C1. Теперь осталось найти координату x2. Для этого коэффициент подобия k умножим на x1 (свойство подобных треугольников).

Рис. 2

В данном случае координата y2 будет равна 5.Если же мяч оттолкнется от точки x1=3, то y2=5 нам уже не подойдет, и нам нужно будет рассчитать точку соприкосновения с правой стенкой. Также продолжим линию до пересечения с осью Oy, получим два подобных треугольника, у одного из которых мы будем знать катет и противолежащий угол. Нам известно, что стена находится на x=8. Найдем сторону B1 (см. рис. 3): B1=x/tg(угол альфа). Чтобы найти сторону B2, нам нужно узнать во сколько раз она меньше стороны B1. Это легко сделать, найдя отношение точек x/x1. Отсюда B2=B1/(x/x1). Под сторонами A1, B1, C1 подразумеваются полные стороны треугольника, а не до соприкосновения со сторонами A2, B2, C2. Когда эти две стороны треугольников найдены, можем найти координату y2: y2=B1-B2.

Рис. 3

Теперь перейдем к движению мяча по найденной траектории. Нам нужно, чтобы мяч переместился из точки (x1,y1) в точку (x2,y2). Распишем всё сразу на языке программирования С++.

  1. double Ball::Move()
  2. { int bool=0;
  3. int x,y,a,b;
  4. double L,t0,vx,vy;
  5. int v=5;//скорость перемещения
  6. int t=0;//время
  7. // вектор перемещения = (x2-x1,y2-y1);
  8. L=sqrt(pow((x2-x1),2)+pow((y2-y1),2));// длина вектора
  9. vx=(x2-x1)/L*v;// проекции скорости на x
  10. vy=(y2-y1)/L*v;// проекции скорости на y
  11. t0=L/v;// время движения по пути
  12. while(t<t0){
  13. if(t+1>=t0) bool=1;
  14. x=x1+vx*t;//вычисляем координаты точки
  15. y=y1+vy*t;
  16. setcolor(4);//устанавливаем цвет контура мяча
  17. setfillstyle(1,4);//метод закраски и цвет мяча
  18. fillellipse(x,y,10,10);//координаты мяча и его радиус (если указать, разные
  19. // цифры, то получится овал)
  20. delay(10);
  21. if(bool!=1){// стираем мяч
  22. setcolor(getbkcolor());
  23. setfillstyle(1,getbkcolor());
  24. fillellipse(a,b,15,15);}
  25. a=x;b=y;
  26. t+=1;}}

На этом пока всё. Как видите, игрострой – это сплошная математика и физика. О программной реализации расчета отражения мяча поговорим в следующей статье. Также в следующих постах я расскажу о том, как добавить ракетки для игроков, компьютера, как компьютер будет отбивать мяч – ведь это всё-таки игра, и компьютер должен поддаваться :-)

 
10 июля 2013, 15:24
765

Загрузка...

Комментарии

Спасибо за пост.

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

Только на 10-й раз он смог поступить в Кембридж! Герой с Кармакшинского района

Только на 10-й раз он смог поступить в Кембридж! Герой с Кармакшинского района

Свыше 10 известных университетов приглашают его обучаться зарубежом, но выбор будет оставаться за Сакеном. Он выберет обучение The University of Edinburgh и отправляется в эту удивительную страну...
socium_kzo
30 нояб. 2016 / 11:06
  • 11027
  • 10
Взгляд со стороны: Назарбаев глазами кыргыза

Взгляд со стороны: Назарбаев глазами кыргыза

В чем уникальность этой личности? В чем его успех или провалы? Эти вопросы требуют глубокой аналитики и исследований. Я же хочу рассказать о Нурсултане Абишевиче глазами рядового кыргыза или...
maxes
1 дек. 2016 / 8:05
  • 4712
  • 14
Молчание врачей. Дети ЮКО, заражённые ВИЧ 10-11 лет назад, узнают о диагнозе-приговоре

Молчание врачей. Дети ЮКО, заражённые ВИЧ 10-11 лет назад, узнают о диагнозе-приговоре

Как сообщают новостные издания, в ближайшее время в Южном Казахстане 102 детям в возрасте 11-12 лет сообщат об их страшном диагнозе. Все эти дети были заражены ВИЧ, причём большинство было инфицировано по вине врачей.
openqazaqstan
2 дек. 2016 / 13:57
  • 3948
  • 4
Когда на тебя смотрят как на говно. На работе многие считали, что они выше меня уровнем

Когда на тебя смотрят как на говно. На работе многие считали, что они выше меня уровнем

Дело было летом 2012 года. Мне было почти 20 лет, жил я от сессии до сессии довольно весело. В голове машины, клубы, тёлки. Жизнь размеренная и неторопливая. Вдруг мне приходит в голову идея...
almatinec_92
28 нояб. 2016 / 16:57
Почему Дональд Трамп назвал Казахстан чудом. Президент подтягивается по географии

Почему Дональд Трамп назвал Казахстан чудом. Президент подтягивается по географии

Трамп и не подозревает, что 16 декабря 1991 Казахстан не создал, а восстановил свою национальную государственность. Иначе бы он упомянул не только 25 лет, а больше чем 550 лет казахской истории.
Stehlikova
2 дек. 2016 / 9:02
  • 4073
  • 86
О переименовании столицы: Казнет не зря взорвался едкими комментариями

О переименовании столицы: Казнет не зря взорвался едкими комментариями

Сеть облетело очень символичное видео, где г-ну Султанову в ходе пресс-конференции прямо задают этот вопрос. «Вы советовались с народом?!» – спрашивают его журналисты. На что депутат так и не смог вразумительно ответить.
openqazaqstan
28 нояб. 2016 / 14:35
  • 3658
  • 15
Аэропорт Схипхол и Алматы. Смотришь на это и ощущение, что мы лет на тридцать отстали

Аэропорт Схипхол и Алматы. Смотришь на это и ощущение, что мы лет на тридцать отстали

Недавно пролетал через аэропорт Амстердама - Схипхол. Так как улетал из аэропорта Алматы, то не мог не начать сравнивать эти аэропорты.
Superkurt
30 нояб. 2016 / 10:09
  • 3307
  • 12
Мой личный опыт использования Astra Plat: мелочи в моем кармане заметно стало меньше

Мой личный опыт использования Astra Plat: мелочи в моем кармане заметно стало меньше

Давно ждал запуска электронного билетирования в общественном транспорте Астаны. В ноябре 2016 года этот день настал. Мой опыт насчитывает последние 2 недели и мне есть чем поделиться. Она не...
iamYerlan
1 дек. 2016 / 15:24
  • 3090
  • 11
Понять и простить: почему большинство стран бывшего СССР отказалось от амнистий

Понять и простить: почему большинство стран бывшего СССР отказалось от амнистий

Президент Назарбаев предложил амнистию для совершивших преступления небольшой тяжести несовершеннолетних, пожилых, женщин и других социально уязвимых категорий осуждённых
openqazaqstan
30 нояб. 2016 / 13:45
  • 2924
  • 19