Я создал программу на Java, где круги могут подпрыгивать друг к другу и тяготеть друг к другу.
По большей части (несколько кружков на экране) заметных ошибок нет. Проблема начинает возникать, когда на экране появляется большое количество кружков. Иногда круги перекрываются, если становится слишком тесно. Это как если бы вес всех остальных кругов сдавливал круги вместе, заставляя их перекрываться. Конечно, там программа ничего не знает о том, сколько весит круг, так что это не совсем сокрушительно. Скорее всего, часть логики, которая обрабатывает разрешение коллизий, не в состоянии справиться с переполненными ситуациями.
Круги хранятся в массиве, и каждый круг проходит через массив с помощью цикла for, сравнивая себя с другими кругами. Если расстояние между центром этого круга и центром другого круга меньше суммы их радиусов, то круги сталкиваются. Скорости обеих окружностей обновляются с использованием уравнения для столкновений.
Я думаю, что проблема возникает потому, что, если окружность окружена, она может получить обновленную скорость в окружности позади нее, в то время как окружность позади нее также получает обновленную скорость в прежнюю окружность. Другими словами, двум кругам говорят двигаться навстречу друг другу, даже если они уже соприкасаются. Как только они перекрываются таким образом, я не знаю, почему они не отменяют свое перекрытие.
Я попытался восстановить сценарий касания, если они перекрываются, находя расстояние, на которое они перекрываются, а затем раздвигая их друг от друга; каждый перемещается на половину расстояния перекрытия. Это не меняет скорость круга, только его положение.
Это все еще не решает проблему. Если круг окружен, и он перекрывается с одним из соседних с ним кругов, его положение изменяется, чтобы они не перекрывались, но эта новая позиция может привести к тому, что он будет перекрываться с другим кругом. Та же проблема.
Если бы не было силы тяжести, сдвигающей круги, они в конечном итоге распространились бы и разрешили свои перекрывающиеся проблемы, но гравитация предотвращает это.
Дополнительная информация:
Гравитация не учитывается при расчете новых скоростей после столкновения.