Просмотр полной версии : Упругий нецентральный удар шаров
Жень Шень
07.05.2004, 16:07
Привет, Народ!
На флеш-сайтах можно встретить много примеров соударения шаров. Но, или в примерах простое отталкивание (инверсия одной координаты), или идет постепенное затухание.
Может кто подскажет код к следующей задачи:
Нужно смоделировать упругое нецентральное соударение двух разных по диаметру (диаметр символизирует массу) шаров с сохранением импульса.
Прошу математиков-программистов помочь.
На сайте есть чудесный пример "Шарики"
http://www.flasher.ru/src/category_41_1/
Но даже если убрать "гравитацию" и "трение" идет постепенное замедление шаров.
Спасибо.
а диссипативные потери при деформации не надо учитывать? :D
ты давай формулы давай, а там и сообразим
Жень Шень
08.05.2004, 11:39
Оригинал написал(а) silin
а диссипативные потери при деформации не надо учитывать? :D
Привет, Silin!
Юмор оценил. Отвечаю: "Кроме диссипативных потерь не надо учитывать искривление квадрупольного момента при входе в квазистатическое поле потенциальной ямы". Короче, относительно того, что ежели так сказать, то оно конечно!
Ну а теперь к делу.
Просмотри, плз, исходник, и если можешь, подправь код в такую сторону:
- при соударении большого и малого шаров приращение скорости малого шара должно быть намного больше другого(закон инерции + сохранение импульса);
- при непродолжительном наблюдении за настоящим роликом видно заметное замедление всех шаров :mad: , чего не требуется.
Первостепенно желательно устранить второй "деффект".
Спасибо.
тоже не строгое решение:при устранении указанных дефектов возникли другие, но может сгодится
нормальное решение (с соблюдением законов сохранение) тоже реально, но повозиться надо
Жень Шень
11.05.2004, 18:29
- Ну, ты могЁшь!
- Не могЁшь, а мОгешь!!!
(из фильма "В бой идут одни старики")
Привет, Silin!
Спасибо, порадывал оригинальным кодом. Есть теперь над чем голову по вечерам поломать.
"Картинка" на самом деле приблизилась к реальности. Единственное но, стала частенько замирать - а комп не слабый (может все-таки проклятая рекурсия :( ). Надо проверить как будет с 50-тью экземплярами работать - диффузию изображать.
Но, пища для серого вещества появилась :)
Спасибо.
Ежели, что рожу - пришлю.
Пока.
Жень Шень
14.05.2004, 11:30
Привет, Silin! :)
Спасибо, чуть позже разберусь. Есть новая работа срочная.
Визуально пока разницу не обнаружил. Все равно есть переодическое замирание "картинка" на пол-секунды" чаще чем обычно, хотя проц загружен на 15-20%.
Вопрос окончательно не закрыт. Тема очень интересная в плане разработки моделей диффузии, сохранения импульса, центральных и не центральных ударов и тптд...прст... :D
Рад буду, если еще кто-нибудь поделится мыслями, идеями, кодом.
До лучших времен. :)
SamTakoy
15.05.2004, 12:05
Привет.
Если схватить один шарик и натащить на другой то они залипают.
Чтобы этого избежать, не надо проверять на столкновение 2 шара, если их векторы скорости направлены в разные стороны, даже при пересечении (шары разлетаются уже, либо один стоит, а другой отлетает от него).
Проверяется просто:
nx = ball2._x - ball._x;
ny = ball2._y - ball._y;
if(
(ball.vx*nx+ball.vy*ny )>0 ||
(-ball2.vx*nx-ball2.vy*ny )>0
){ можно проверять на пересечение }
Здесь
ball, ball2 - шарики;
vx, vy - составляющие их скоростей.
nx, ny - вектор - направленный от центра одного шара к другому.
Проверяется знак скалярного произведения векторов => определяем факт того что хоть один шар движется в направлении другого.
А в функции пересечений у тебя слишком много синусов, косинусов, извлечений корня и т.д. Можно и проще. Подумаю, может напишу как :)
Жень Шень
15.05.2004, 12:44
Привет, SamTakoy!
Спасибо за участие.
Оригинал написал(а) SamTakoy
не надо проверять на столкновение 2 шара, если их векторы скорости направлены в разные стороны, даже при пересечении (шары разлетаются уже, либо один стоит, а другой отлетает от него).
Возможны варианты при разнонаправленых векторах:
Шары расходятся не встречаясь.
Шары перекрываються после получения приращения.
Траектории перекрываються после получения приращения.
Во-втором и третем случае для подсчета правильного угла отклонения без синускосинусов не обойтись. Ведь может быть и не центральный удар, лобовой встречный, касательно-паралельный.
Но! Замечание принимается для дальнейшего "обгладывания"
Ну, SamTakoy, жду когда мысль посетит :D
SamTakoy
15.05.2004, 14:14
В общем, я как-то делал бильярд. Основная идея такая.
При столкновении двух шаров - "мысленно" проводим линию между их центрами. И переходим к новой системе координат,
в которой эта линия становится осью ox. Т.е. преобразуем в эту систему координат составляющие их скорости: vx и vy.
Рассматриваем удар в этой системе координат (получается простейший случай столкновения). В бильярде для шаров одинакового размера и массы я просто менял горизонтальные составляющие скоростей (т.к. удар абсолютно упругий), а вертикальные оставлял прежними (т.к. взаимодействие только по горизонтали, то вертикальные составляющие не влияют на удар).
После этого найденные компоненты скоростей возвращал в старую систему координат.
И вуаля! Все работает :)
Для шаров разной массы отличие будет только в том как обменивать их горизонтальные составляющие скоростей (в зависимости от массы). (над этим придется подумать :))
Надеюсь, я понятно изложил :)
Можешь еще вот здесь посмотреть по столкновениям:
http://pmg.org.ru/russian/nehe/nehe30.htm
SamTakoy
15.05.2004, 14:26
О-па... Бильярд как раз выложили.
Смотреть здесь, если интересно:
http://vkids.km.ru/
Если схватить один шарик и натащить на другой то они залипают
драг был добавлен для отладки( поменять скорость) и никакого отношения к взаимодействию шаров не имеет (пример тока про размен импульсов с сохранением энергии)
А в функции пересечений у тебя слишком много синусов, косинусов, извлечений корня и т.д. Можно и проще
:D с удовольствием поглядим
SamTakoy
15.05.2004, 23:29
В общем вот что пока получилось.
годится,
правда если ты полагаешь, что уменьшил нагрузку на проц, то нет (сравни)
а столкновение решаешь не строго (потрейсь сумму mv^2), что чревато нелогичным поведением шариков (если понаблюдать то есть такое)
SamTakoy
16.05.2004, 14:36
виноват :)
немного модифицируем и получаем строгое решение, с сохранением энергии:
( всего одно извлечение корня :), хотя процессор загружает даже немного больше :( )
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.