На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Снова о соударении...
    Всем привет ! :)

    У меня возникла проблема с просчетом столкновений шариков. Да, согласен, тема уже поднималась, и неоднократно. Но ответа на свою проблему в предыдущих топиках я не нашел.
    Задача в двух словах. Двухмерное пространство, где фактически подвешенные в воздухе, летают шарики разного диаметра. Имею их массы (m), радиусы ®, скорости Vx, Vy. Удары абсолютно упругие, трения нет, то бишь движение вечно. Вроде бы все просто, но вот загвоздка - используя обычные формулы расчета скоростей при упругом ударе (v1 = 2*m2*v20 + (m1-m2)... и т.д.) соударение получается центральным, то есть каждый шарик мы расчитываем, как будто он просто точка. Выглядит это ужасно.
    В предыдущих топиках нашел исходник симуляции бильярда:
    http://www.delphikingdom.com/mastering/poligon/billiard.htm.
    Эта модель уже более реалистична, но она расчитана не на абсолютно упругое столкновение, то есть скорость постоянно теряется, так как расчет идет по проекциям.

    И вот теперь, перепробовав все, сижу в задумчивости, как же это сделать. Может, надо было в школе/универе физику учить ?
    Помогите идеями, плиз. Если что-то изложил неясно - поясню. Спасибо за внимание.
         Не знаю поможет ли, но вообще есть два вида упругих столкновений:
         1. центральное столкновение идет вдоль оси, соединяющей центры масс и соответственно скорости направлены также вдоль этой оси
         2. не центральное столкновение -  если не изменяет память, то вроде как шарики разлетаются на 90 градусов (уверен на 85\% :) ) , а про скорости не помню. Вспомню - напишу.
       А вообще , по-моему , это более связано с физикой , чем с алгоритмами
        могу предложить аж два способа решения проблемы.
        1. Если я правильно понял, в указанном биллиарде модель столкновения хорошая, но похоже, что программер не потрудился следить за выполнением закона сохранения энергии. Из-за малых погрешностей при расчётах в систему постоянно поступает энергия, скорость движения шаров постоянно возрастает и происходит неприятность. Думаю, если на каждом ходу подсчитывать общее количество энергии в системе, сравнивать с поданым при ударе, и при необходимости умножать/делить скорость каждого шара на одно и то же число (близкое к 1), с тем чтобы вернуться к требуемому уровню энергии - всё будет ОК.

        2. попробовать перейти к другому способу моделирования биллиарда. Сейчас используется модель абсолютно упругих несжимаемых шаров. Можно делать по другому - со стороны каждого шара на каждый шар действует сила, равная нулю, если расстояние между шарами больше их диаметров, и отталкивающая от шар от центра другого шара всё сильнее и сильнее со сближением шаров. Т.е. представьте, что играете в биллиард одноименно заряженными частицами, отталкивающими друг друга. Причем силы действуют не по закону Кулона, а так чтоб на расстоянии больше определенного совсем не действовали, но при меньшем - действовали очень сильно.
        Так вот, при такой модели можно использовать методы решения систем диффуров (скажем, Рунге-Кутт с регулировкой шага). Плюс, конечно, следить за сохранением энергии.
          Цитата ShtacketT, 22.04.03, 18:27:46
          2. не центральное столкновение -  если не изменяет память, то вроде как шарики разлетаются на 90 градусов (уверен на 85\% :) ) , а про скорости не помню.

          не похоже на правду. Насколько я помню свой опыт игры в биллиард (не виртуальный), при ударе движущимся шаром по неподвижному, эффект для неподвижного шара такой же, как при ударе кием по точке соприкосновения.


            Цитата shadeofgray, 22.04.03, 19:40:50
            могу предложить аж два способа решения проблемы.
            Имхо, слишком сложно и замороченно. Повторяю - имхо.
            Неужели нет относительно простой методики просчета соударения двух шариков ? Данных-то хоть отбавляй. Насколько я понимаю, это как-то должно быть замешано на центрах масс, но как... Продолжаю поиск.
            Да, кстати, может у кого есть классная ссылочка на страничку по моделированию физических процессов ? Неважно, на русском или на английском. То, что пока нашел, не впечатляет.
              Цитата shadeofgray, 22.04.03, 19:43:32

              не похоже на правду. Насколько я помню свой опыт игры в биллиард (не виртуальный), при ударе движущимся шаром по неподвижному, эффект для неподвижного шара такой же, как при ударе кием по точке соприкосновения.



                 может быть, в жизни и так, но человеку необходима теория. К тому же, на практике есть много факторов, которые не учитываются этой самой теорией, например:
              1. трение (хоть и малое, но есть)
              2. вращение шаров (в теории рассматривается лишь паралельный перенос фигур/объектов)
              3. к тому же, вряд ли в жизни можно найти пример абсолютно упругого соударения
               Кстати, когда нам рассказал это учитель, я тоже долго плевался и не верил, но он же на то и учитель :)
                Цитата reporter, 22.04.03, 20:08:06
                Неужели нет относительно простой методики просчета соударения двух шариков ?

                Есть. Для удара двух невращающихся абсолютно упругих шаров работает след. способ:
                1. спроецировать скорости на прямую А, соединяющую центры масс шаров.
                2. просчитать изменение проекций скоростей на эту линию
                3. ортогональные к линии составляющие скоростей оставить без изменений

                Как посчитать пункт 2:
                Если два шара движутся с одной скоростью по одной прямой навстречу друг другу, то после удара их скорости поменяются на противоположные.
                Спроецировав скорости двух шаров на прямую А, перейдём к системе координат, движущейся вдоль прямой А, в которой эти проекции равны по модулю, противоположны по знаку.
                Итоговое изменение скорости каждого шара составит одну и ту же величину - удвоенное значение этой самой проекции.

                Детали - формулы перехода и т.д. можно расчитать без особого напряга.

                Но:
                1)кажется, именно этот алгоритм уже опробован в вышеуказанной программе
                2)он годится только для парных столкновений шаров (когда сталкиваются три шара - не гуд).
                3)шары не вращаются (но могут быть не вполне упругими)
                4)опять-таки, при длительной игре без трения могут накапливаться погрешности



                Теперь по поводу дополнительных факторов:
                конечно, всё это влияет. Но для удара двух невращающихся шаров моя методика позволяла мне забивать шар N2 в лузу через шар N1, по которому я ударил черным. Хотя, опытный игрок сделал бы это на глаз, интуитивно... Может надо вместо ударов моделировать интуицию опытного игрока :)?
                  Да, именно эту идею я и развивал, но пока ничего путного не получилось, надо выспаться и еще раз попробовать.
                  Кстати, насчет столкновений трех шаров - почему бы не просчитывать их один за другим, 1-2, 2-3, 1-3. Ведь и в реальности вряд ли возможна ситуация, когда все три шара сталкиваются вместе в _одно_и_то_же_ время...
                       О, человек, сходи на 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 (здесь скорости скалярно, а не произведение векторов)
                       Ну вот...
                      Цитата shadeofgray, 22.04.03, 19:40:50
                      Думаю, если на каждом ходу подсчитывать общее количество энергии в системе, сравнивать с поданым при ударе, и при необходимости умножать/делить скорость каждого шара на одно и то же число (близкое к 1), с тем чтобы вернуться к требуемому уровню энергии - всё будет ОК.

                      понаучному ето называется термостат берендсена ;D (см вторую ссылку vvvvv) ;D есть более разумный способ. вычисляешь енергию, а отношение правильной и текущеё енергии и будет етим близким к единице числом. так ты получишь правильную енергию уже за 1 шаг.

                      что же касается вращения, то я думаю, что оно не оказывает большого влияния на движение. в крайнем случае можно нарисовать 2 соприкасающихся шара, расписать скорости их поверхностей до столкновения, приравнять друг другу их тангенциальные (параллельные поверхности соприкосновения) компоненты скорости после столкновения и юзать законы сохранения энергии и  момента инерции.

                      а что касается попарного взаимодействия.... берёшь все пары шаров, находишь, какая пара столкнётся раньше и когда ето произойдёт, вычисляешь свой биллиард в етот момент времени и дальше идёшь. а если ты будешь просто попарно без разбора считать, то может получиться так, что шар столкнётся сначала с шаром, с которым он должен был столкнуться позже, и тогда получится наверное глупость.
                      Сообщение отредактировано: wormball -
                        Цитата ShtacketT, 24.04.03, 17:43:36
                        И еще, мне вот тоже один вроде умный человек, все можно решить из системы двух уравнений:

                        эти уравнения не учитывают расположения шаров при ударе (а это очень важно). Такое годится только при центральном ударе.
                          Простите меня дурака, за то что вклиниваюсь в ваш высоко интелектуальный разговор, но у меня проблема, прошу помочь

                          на одном форуме мы решили замутить биллиард онлайн, ну что бы было все как положенно, но есть такая проблема, у нас нету исходников для данного действия, форум версии IPB 2.3.5
                          и в поисковиках найти не получалось, три дня уже капаюсь... :wall:
                          в общем, у кого нить есть исходник для онлайн версии биллиарда (ну что бы были два режима, с компьютером и с другим игроком + четыре вида (снукер, 8 баллов, 9 баллов, русский биллиард))
                          буду очень признателен, за оказанную вами помощ...
                            Цитата Наль Капона @
                            Простите меня дурака, за то что вклиниваюсь в ваш высоко интелектуальный разговор

                            А то что прошло пять с половиной лет - это ничего? :D
                            Цитата Наль Капона @
                            у кого нить есть исходник для онлайн версии биллиарда (ну что бы были два режима, с компьютером и с другим игроком + четыре вида (снукер, 8 баллов, 9 баллов, русский биллиард))
                            буду очень признателен, за оказанную вами помощ...

                            Тот, у кого есть такой исходник, или заплатил за него (и немало), или написАл его с коммерческой целью. Так что нахаляву тебе точно не обломится. Поисковик, кстати, тебе это уже сказал.
                              :o

                              ну а поисковик вообще никакого исходника не нашел, ну из тех что мне нужны...

                              кто нить поможет мне написать исходник!?
                              ссылочками для чайников там где все по полочкам раписанно
                                Цитата Наль Капона @
                                кто нить поможет мне написать исходник!?
                                ссылочками для чайников там где все по полочкам раписанно

                                На форуме вроде бы есть раздел, в котором можно разместить заказ. Рекомендую обратиться туда. Мне кажется, что просить незнакомых (или даже знакомых людей) сделать бесплатно "чтобы были два режима, с компьютером и с другим игроком + четыре вида (снукер, 8 баллов, 9 баллов, русский биллиард)" несколько некорректно.

                                Добавлено
                                P.S. Это мой официальный совет, как модератора раздела.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0516 ]   [ 15 queries used ]   [ Generated: 21.05.24, 08:11 GMT ]