![]() |
|
Модераторы: Poseidon |
![]()
|
|
| Alex31kv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 3.3.2007 Репутация: нет Всего: нет |
Нарисовать бильярдный стол (без луз) и шарик на столе, бьем по шарику кием под углом альфа, угол выбираем сами.
Показать как будет двигаться шарик сохраняя законы физики (угол падения равен углу отражения). P.S. Должен двигаться шарик, след от него не нужен. |
|||
|
||||
| Alex31kv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 3.3.2007 Репутация: нет Всего: нет |
подскажите как сделать что бы шарик двигался?
Это сообщение отредактировал(а) Alexeis - 29.4.2007, 12:50 |
|||
|
||||
| dizzy1984 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 675 Регистрация: 15.2.2007 Репутация: 10 Всего: 25 |
В общем и целом идея такова.
Если шарик двигается равномерно, то в каждый момент времени шарик увеличивает свои координаты на некторое постоянное значение по х и у. При соударении с бортом бильярдного стола та величина, которая не может более увеличивать или уменьшать соответствующую координату меняет свое значение на противоположное. Так шарик двигавшийся вверх столкнувшись с бортом будет двигаться вниз. Вот псевдокод. 1. Нарисовать стол 2. Нарисовать шарик 3. Модифицировать координаты х и у. 4. Проверить наличие столкновения. 5. В случае наличия инвертировать соответствующую характеристику. 6. Подождать некоторое время 7. Перейти к шагу 1 |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Недавно делал.
Клавиши 'q' - выход 'w' - переместить вверх 'a' - вправо 'd' - влево 's' - вниз 'e - изм. угол 'r' - изм. угол '+' - сила удара '-' - сила удара пробел - начать движение Добавлено через 2 минуты и 21 секунду Там есть некоторые недочёты, как то лишний параметр у функции ball_drive. Тебе нужна именно функция ball_drive Присоединённый файл ( Кол-во скачиваний: 147 )
14_9_TC.ZIP 49,48 Kb |
|||
|
||||
| Alex31kv |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 10 Регистрация: 3.3.2007 Репутация: нет Всего: нет |
En_t_end,
супер, сделал красиво, вот только с физикой как то не очень, не знаешь как ее доработать? |
|||
|
||||
| En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 2 Всего: 20 |
Alex31kv,
Как раз с физикой там всё нормально Доработать её можно и нужно. 1. разберись с расчётом углов отражений. Я, дабы не заморачиваться разбил задачу на подзадачи. Поясняю, нам изначально неизвестно в какой борт попадёт шар, если разбить плоскость стола на четыре квадранта(относительно угла удара), то теперь мы должны выбирать в какой из двух бортов происходит удар. Чтобы это сделать нужно построить треугольник с гипотенузой от позиции шара до лузы(к этому времени у программы будет всего лишь одна луза для удара) и посмотреть угол образованный этой прямой. Т.е теперь сравнивая угол удара и угол обр. прямой построенной в лузу мы можем однозначно определить в какой борт будет удар. Ну а дальше просто расчитывается точка пересечения двух прямых : борта и прямой удара. Проблема: слишком много кода для решения данной подзадачи. Проблема: ошибки расчета угла отражения при углах удара(после преобразования к углу определенного квадранта) близких к 90 градусам и 0 градусов. У меня есть предположение, что в этом виноваты реализации тригонометрических функций в старых либах, они вообще ИМХО 16 разрядные 2. Следующая задача - это движение шара по прямой с учётом законов физики. а)узнаешь длину отрезка движения(по двум точкам) б)прогоняешь цикл с итерациями(итератор i) от 0 до длины отрезка. Расчёт текущей точки отрисовки шара выполняешь по следуюшим формулам: x = A1.x(+-)i*cos(alfa) y = A1.y(+-)i*sin(alfa) alfa - угол между прямой паралельной оси 0x и прямой удара. Т.е узнаешь абсциссу и ординату текущей точки отрисовки шара. Далее, приращение i - есть ускорение a. a = (F_удара - F_тр)/m. В конце каждой итерации ускорение перерасчитывается. Здесь проблема в том, как определить приращение итератора, как напрямую добавлять ускорение или подвергнуть ускорение ещё каким-то преобразованиям. Это сообщение отредактировал(а) En_t_end - 6.5.2007, 16:31 |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |