Каков наилучший способ проверки столкновения огромного количества кругов?
Очень легко обнаружить столкновение между двумя кругами, но если мы проверим каждую комбинацию, то она O (n 2), которая определенно не является оптимальным решением.
Мы можем предположить, что объект окружности имеет следующие свойства:
- Координаты
- Радиус
- Скорость
- Direction
Скорость постоянна, но направление может меняться.
Я придумал два решения, но, возможно, есть несколько лучших решений.
Решение 1
Разделите все пространство на перекрывающиеся квадраты и проверьте на столкновение только с кругами, которые находятся в одном квадрате. Квадраты должны пересекаться, поэтому не будет проблем, когда круг перемещается с одного квадрата на другой.
Решение 2
В начале нужно рассчитать расстояния между каждой парой кругов.
Если расстояние невелико, эти пары хранятся в некотором списке, и нам нужно проверить наличие конфликтов в каждом обновлении.
Если расстояние велико, то мы сохраняем, после чего обновление может быть столкновением (его можно вычислить, потому что мы знаем расстояние и скорость). Он должен храниться в какой-то очереди приоритетов. После того, как предварительно рассчитанное количество интервалов обновлений нужно снова проверить, а затем мы выполним ту же процедуру - поместите ее в список или снова в очередь приоритетов.
Ответы на вопросы Марка Байера
- Это для игры?
Это для моделирования, но его можно рассматривать также как игру - Вы хотите пересчитать новую позицию каждые n миллисекунд, а также проверить наличие конфликтов в это время?
Да, время между обновлениями постоянно. - Вы хотите найти время, в которое происходит первое/любое столкновение?
Нет, я хочу найти каждое столкновение и делать "что-то", когда это происходит. - Насколько важна точность?
Это зависит от того, что вы подразумеваете под точностью. Мне нужно обнаружить все столкновения. - Это большая проблема, если очень маленькие быстро движущиеся круги иногда могут проходить друг с другом?
Можно предположить, что скорость настолько мала, что этого не произойдет.