
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.175] |
![]() |
|
Сообщ.
#1
,
|
|
|
Всем привет !
![]() У меня возникла проблема с просчетом столкновений шариков. Да, согласен, тема уже поднималась, и неоднократно. Но ответа на свою проблему в предыдущих топиках я не нашел. Задача в двух словах. Двухмерное пространство, где фактически подвешенные в воздухе, летают шарики разного диаметра. Имею их массы (m), радиусы ®, скорости Vx, Vy. Удары абсолютно упругие, трения нет, то бишь движение вечно. Вроде бы все просто, но вот загвоздка - используя обычные формулы расчета скоростей при упругом ударе (v1 = 2*m2*v20 + (m1-m2)... и т.д.) соударение получается центральным, то есть каждый шарик мы расчитываем, как будто он просто точка. Выглядит это ужасно. В предыдущих топиках нашел исходник симуляции бильярда: http://www.delphikingdom.com/mastering/poligon/billiard.htm. Эта модель уже более реалистична, но она расчитана не на абсолютно упругое столкновение, то есть скорость постоянно теряется, так как расчет идет по проекциям. И вот теперь, перепробовав все, сижу в задумчивости, как же это сделать. Может, надо было в школе/универе физику учить ? Помогите идеями, плиз. Если что-то изложил неясно - поясню. Спасибо за внимание. |
Сообщ.
#2
,
|
|
|
Не знаю поможет ли, но вообще есть два вида упругих столкновений:
1. центральное столкновение идет вдоль оси, соединяющей центры масс и соответственно скорости направлены также вдоль этой оси 2. не центральное столкновение - если не изменяет память, то вроде как шарики разлетаются на 90 градусов (уверен на 85\% ![]() А вообще , по-моему , это более связано с физикой , чем с алгоритмами |
![]() |
Сообщ.
#3
,
|
|
могу предложить аж два способа решения проблемы.
1. Если я правильно понял, в указанном биллиарде модель столкновения хорошая, но похоже, что программер не потрудился следить за выполнением закона сохранения энергии. Из-за малых погрешностей при расчётах в систему постоянно поступает энергия, скорость движения шаров постоянно возрастает и происходит неприятность. Думаю, если на каждом ходу подсчитывать общее количество энергии в системе, сравнивать с поданым при ударе, и при необходимости умножать/делить скорость каждого шара на одно и то же число (близкое к 1), с тем чтобы вернуться к требуемому уровню энергии - всё будет ОК. 2. попробовать перейти к другому способу моделирования биллиарда. Сейчас используется модель абсолютно упругих несжимаемых шаров. Можно делать по другому - со стороны каждого шара на каждый шар действует сила, равная нулю, если расстояние между шарами больше их диаметров, и отталкивающая от шар от центра другого шара всё сильнее и сильнее со сближением шаров. Т.е. представьте, что играете в биллиард одноименно заряженными частицами, отталкивающими друг друга. Причем силы действуют не по закону Кулона, а так чтоб на расстоянии больше определенного совсем не действовали, но при меньшем - действовали очень сильно. Так вот, при такой модели можно использовать методы решения систем диффуров (скажем, Рунге-Кутт с регулировкой шага). Плюс, конечно, следить за сохранением энергии. |
![]() |
Сообщ.
#4
,
|
|
Цитата ShtacketT, 22.04.03, 18:27:46 2. не центральное столкновение - если не изменяет память, то вроде как шарики разлетаются на 90 градусов (уверен на 85\% ![]() не похоже на правду. Насколько я помню свой опыт игры в биллиард (не виртуальный), при ударе движущимся шаром по неподвижному, эффект для неподвижного шара такой же, как при ударе кием по точке соприкосновения. |
Сообщ.
#5
,
|
|
|
Цитата shadeofgray, 22.04.03, 19:40:50 Имхо, слишком сложно и замороченно. Повторяю - имхо.могу предложить аж два способа решения проблемы. Неужели нет относительно простой методики просчета соударения двух шариков ? Данных-то хоть отбавляй. Насколько я понимаю, это как-то должно быть замешано на центрах масс, но как... Продолжаю поиск. Да, кстати, может у кого есть классная ссылочка на страничку по моделированию физических процессов ? Неважно, на русском или на английском. То, что пока нашел, не впечатляет. |
Сообщ.
#6
,
|
|
|
Цитата shadeofgray, 22.04.03, 19:43:32 не похоже на правду. Насколько я помню свой опыт игры в биллиард (не виртуальный), при ударе движущимся шаром по неподвижному, эффект для неподвижного шара такой же, как при ударе кием по точке соприкосновения. может быть, в жизни и так, но человеку необходима теория. К тому же, на практике есть много факторов, которые не учитываются этой самой теорией, например: 1. трение (хоть и малое, но есть) 2. вращение шаров (в теории рассматривается лишь паралельный перенос фигур/объектов) 3. к тому же, вряд ли в жизни можно найти пример абсолютно упругого соударения Кстати, когда нам рассказал это учитель, я тоже долго плевался и не верил, но он же на то и учитель ![]() |
![]() |
Сообщ.
#7
,
|
|
Цитата reporter, 22.04.03, 20:08:06 Неужели нет относительно простой методики просчета соударения двух шариков ? Есть. Для удара двух невращающихся абсолютно упругих шаров работает след. способ: 1. спроецировать скорости на прямую А, соединяющую центры масс шаров. 2. просчитать изменение проекций скоростей на эту линию 3. ортогональные к линии составляющие скоростей оставить без изменений Как посчитать пункт 2: Если два шара движутся с одной скоростью по одной прямой навстречу друг другу, то после удара их скорости поменяются на противоположные. Спроецировав скорости двух шаров на прямую А, перейдём к системе координат, движущейся вдоль прямой А, в которой эти проекции равны по модулю, противоположны по знаку. Итоговое изменение скорости каждого шара составит одну и ту же величину - удвоенное значение этой самой проекции. Детали - формулы перехода и т.д. можно расчитать без особого напряга. Но: 1)кажется, именно этот алгоритм уже опробован в вышеуказанной программе 2)он годится только для парных столкновений шаров (когда сталкиваются три шара - не гуд). 3)шары не вращаются (но могут быть не вполне упругими) 4)опять-таки, при длительной игре без трения могут накапливаться погрешности Теперь по поводу дополнительных факторов: конечно, всё это влияет. Но для удара двух невращающихся шаров моя методика позволяла мне забивать шар N2 в лузу через шар N1, по которому я ударил черным. Хотя, опытный игрок сделал бы это на глаз, интуитивно... Может надо вместо ударов моделировать интуицию опытного игрока ![]() |
Сообщ.
#8
,
|
|
|
Да, именно эту идею я и развивал, но пока ничего путного не получилось, надо выспаться и еще раз попробовать.
Кстати, насчет столкновений трех шаров - почему бы не просчитывать их один за другим, 1-2, 2-3, 1-3. Ведь и в реальности вряд ли возможна ситуация, когда все три шара сталкиваются вместе в _одно_и_то_же_ время... |
Сообщ.
#9
,
|
|
|
О, человек, сходи на http://www.docs.h1.ru там в "алгоритмах" вроде что-то было о соударении
Кстати, shadeofgray, я говорю лишь то, чему меня учили в школе - так что если что-то не так, то вопросы не ко мне, а к нашему физику. И еще, мне вот тоже один вроде умный человек, все можно решить из системы двух уравнений: (з.с.Импульса): m1*V1 + m2*V2 = m1*U1 + m2*U2 (V1 , V2 , U1 , U2 - векторно , массы - скалярно ![]() (з.с.Энергии) m1*V1^2 + m2*V2^2 = m1*U1^2 + m2*U2^2 (здесь скорости скалярно, а не произведение векторов) Ну вот... |
Сообщ.
#10
,
|
|
|
Цитата shadeofgray, 22.04.03, 19:40:50 Думаю, если на каждом ходу подсчитывать общее количество энергии в системе, сравнивать с поданым при ударе, и при необходимости умножать/делить скорость каждого шара на одно и то же число (близкое к 1), с тем чтобы вернуться к требуемому уровню энергии - всё будет ОК. понаучному ето называется термостат берендсена ;D (см вторую ссылку vvvvv) ;D есть более разумный способ. вычисляешь енергию, а отношение правильной и текущеё енергии и будет етим близким к единице числом. так ты получишь правильную енергию уже за 1 шаг. что же касается вращения, то я думаю, что оно не оказывает большого влияния на движение. в крайнем случае можно нарисовать 2 соприкасающихся шара, расписать скорости их поверхностей до столкновения, приравнять друг другу их тангенциальные (параллельные поверхности соприкосновения) компоненты скорости после столкновения и юзать законы сохранения энергии и момента инерции. а что касается попарного взаимодействия.... берёшь все пары шаров, находишь, какая пара столкнётся раньше и когда ето произойдёт, вычисляешь свой биллиард в етот момент времени и дальше идёшь. а если ты будешь просто попарно без разбора считать, то может получиться так, что шар столкнётся сначала с шаром, с которым он должен был столкнуться позже, и тогда получится наверное глупость. |
![]() |
Сообщ.
#11
,
|
|
Цитата ShtacketT, 24.04.03, 17:43:36 И еще, мне вот тоже один вроде умный человек, все можно решить из системы двух уравнений: эти уравнения не учитывают расположения шаров при ударе (а это очень важно). Такое годится только при центральном ударе. |
Сообщ.
#12
,
|
|
|
Простите меня дурака, за то что вклиниваюсь в ваш высоко интелектуальный разговор, но у меня проблема, прошу помочь
на одном форуме мы решили замутить биллиард онлайн, ну что бы было все как положенно, но есть такая проблема, у нас нету исходников для данного действия, форум версии IPB 2.3.5 и в поисковиках найти не получалось, три дня уже капаюсь... ![]() в общем, у кого нить есть исходник для онлайн версии биллиарда (ну что бы были два режима, с компьютером и с другим игроком + четыре вида (снукер, 8 баллов, 9 баллов, русский биллиард)) буду очень признателен, за оказанную вами помощ... |
![]() |
Сообщ.
#13
,
|
|
Цитата Наль Капона @ Простите меня дурака, за то что вклиниваюсь в ваш высоко интелектуальный разговор А то что прошло пять с половиной лет - это ничего? ![]() Цитата Наль Капона @ у кого нить есть исходник для онлайн версии биллиарда (ну что бы были два режима, с компьютером и с другим игроком + четыре вида (снукер, 8 баллов, 9 баллов, русский биллиард)) буду очень признателен, за оказанную вами помощ... Тот, у кого есть такой исходник, или заплатил за него (и немало), или написАл его с коммерческой целью. Так что нахаляву тебе точно не обломится. Поисковик, кстати, тебе это уже сказал. |
Сообщ.
#14
,
|
|
|
![]() ну а поисковик вообще никакого исходника не нашел, ну из тех что мне нужны... кто нить поможет мне написать исходник!? ссылочками для чайников там где все по полочкам раписанно |
![]() |
Сообщ.
#15
,
|
|
Цитата Наль Капона @ кто нить поможет мне написать исходник!? ссылочками для чайников там где все по полочкам раписанно На форуме вроде бы есть раздел, в котором можно разместить заказ. Рекомендую обратиться туда. Мне кажется, что просить незнакомых (или даже знакомых людей) сделать бесплатно "чтобы были два режима, с компьютером и с другим игроком + четыре вида (снукер, 8 баллов, 9 баллов, русский биллиард)" несколько некорректно. Добавлено P.S. Это мой официальный совет, как модератора раздела. |