Как справиться с одновременным столкновением, чтобы порядок обработки не имел значения?

Предположим, что одновременно сталкиваются 3 шара. Я обнаружил, что порядок, в котором я разрешаю столкновения, влияет на конечный результат, что, конечно, не имеет смысла.

Чтобы объяснить и упростить задачу, рассмотрим 3 шара в 1D, все той же массы, упругое столкновение. Цифры вверху - это скорости, а стрелки - это направление. Предположим, что они в настоящее время все касаются друг друга, то есть в столкновении

 -->2   -->1 <---3
   O     O       O
   A     B       C

Это показывает, что мяч A ударяет мяч B со спины, а мяч B и C сталкиваются лицом к лицу.

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

Но это не так.

first case: A with B, followed by B with C

А с Б дает

 -->1   -->2
   O     O  
   A     B  

и B с C дает (но используя новую скорость B 2 выше, а не исходную скорость 1)

 <--3   -->2
   O     O  
   B     C  

Следовательно, конечный результат

 -->1   <--3  ---->2
   O     O       O
   A     B       C
second case: B with C, followed by A with B

Б с С дает

 <--3   --->1
   O     O  
   B     C

A с B (но используя новую скорость B из 3 выше, а не оригинал 1)

<--3    -->2
   O     O  
   A     B  

Следовательно, конечный результат

 <--3  -->2   ---->1
   O     O       O
   A     B       C

Вы можете видеть, что конечное состояние отличается.

Что я делаю неправильно? и что еще более важно, каков правильный способ справиться с этим?

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос