• 8594
  • 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
812

Loading...

Комментарии

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

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

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

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

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

Исламская ипотека в Казахстане: в этом году выйдет на розничный рынок

Исламская ипотека в Казахстане: в этом году выйдет на розничный рынок

Многие клиенты, вздыхая о харамном ссудном проценте местных банков, сокрушались по поводу отсутствия у нас халяльного кредитования. Поддержка исламского банкинга на уровне МФЦА есть...
DanaJarlygapova
24 марта 2017 / 18:28
  • 18018
  • 54
Престарелый старец-киборг Рокфеллер предлагал уничтожить 90% населения Земли

Престарелый старец-киборг Рокфеллер предлагал уничтожить 90% населения Земли

Первую пересадку сердца Рокфеллер пережил в 1976 году на 62-м году жизни. Последнюю пересадку ему сделали в августе 2016 года. Пересадка сердца такому старому пациенту не имеет аналогов...
Timur_Tregulov
21 марта 2017 / 23:10
  • 7254
  • 52
Компания LG Electronics открыла предзаказ на новый флагман LG G6

Компания LG Electronics открыла предзаказ на новый флагман LG G6

LG Electronics объявляет о начале предварительного заказа онлайн на новый смартфон LG G6. Оформить предзаказ можно на сайтах магазинов электроники до 16 апреля 2017 года.
LG Electronics
24 марта 2017 / 14:20
  • 4906
  • 0
Беременность по-американски. Никто не ждет до 40 дней, с малышом гуляют с первого дня

Беременность по-американски. Никто не ждет до 40 дней, с малышом гуляют с первого дня

Мои волшебные 9 месяцев протекали в новой среде и далеко от всех родственников и подружек. Никто из моих знакомых в США на тот момент не успел обзавестись малышом, поэтому мне не с кем было...
Zarema_
23 марта 2017 / 9:25
  • 4708
  • 16
Алматы – это город-урод. Если вы живете здесь, то сами найдете кучу примеров

Алматы – это город-урод. Если вы живете здесь, то сами найдете кучу примеров

Париж, Рим, Барселона, Лондон, Алматы, Венеция – выберите город, который на ваш взгляд кажется лишним в этом списке. Если бы не было слова "урод", было бы легче определиться?
corridere
21 марта 2017 / 14:59
  • 4821
  • 75
Страну, где так строят дороги, победить невозможно!

Страну, где так строят дороги, победить невозможно!

Шестиминутный ролик про строительство автомобильной дороги в США - это как острый нож в пузо нашим чиновникам. Они же подавятся бешбармаком, увидев его! Похлеще любого пропагандистского фильма...
Timur_Tregulov
24 марта 2017 / 11:26
  • 4105
  • 33
Это вам не Дисней. Реальный прототип «Красавицы и Чудовища»

Это вам не Дисней. Реальный прототип «Красавицы и Чудовища»

Многие уверенны на 100%, что сказка «Красавица и Чудовище» - это интересная выдумка ее создателей. Однако, действия, происходящие в мультфильме и фильме, имели место в истории, и у главных героев...
Naomi_K
24 марта 2017 / 18:42
  • 4418
  • 34
Семь причин почему вам надо перестать откладывать переезд за границу

Семь причин почему вам надо перестать откладывать переезд за границу

Вы думаете о переезде за границу, но постоянно откладываете дату, потому что вас беспокоит тысяча мелочей, которые могут пойти не так? У меня есть семь причин, почему пора перестать мотать нервы...
Lesch
24 марта 2017 / 17:50
  • 3255
  • 14
Гонения на «Свидетелей Иеговы». Кому это выгодно?

Гонения на «Свидетелей Иеговы». Кому это выгодно?

Я не "Свидетель Иеговы". Мне приходилось защищать в судах и кришнаитов и коммунистов, хотя я и не разделяю их убеждений. Я защищаю свободу совести. Сегодня "Свидетели Иеговы", завтра,- каждый из вас.
nasreddin
25 марта 2017 / 17:18
  • 3139
  • 33