Существуют " пространственный индекс " структур данных для хранения ваших кругов для быстрого сравнения позже; Quadtree, r-tree и kd-tree являются примерами.
Решение 1 представляется пространственным индексом, а решение 2 выигрывает от использования пространственного индекса каждый раз, когда вы пересчитываете свои пары.
Чтобы усложнить ситуацию, ваши объекты движутся - они имеют скорость.
Обычно пространственные индексы используются для объектов в играх и симуляциях, но в основном для стационарных объектов и, как правило, объектов, которые не реагируют на столкновение при движении.
Это нормально в играх и так, что вы вычисляете все через заданные промежутки времени (дискретно), поэтому может случиться так, что два объекта проходят друг через друга, но вы не заметите, потому что они двигались так быстро. Многие игры даже не оценивают столкновения в строгом хронологическом порядке. Они имеют пространственный индекс для стационарных объектов, например стены, и списки для всех движущихся объектов, которые они проверяют исчерпывающе (хотя с ослабленными дискретными проверками, как я обрисовал).
Точное непрерывное обнаружение столкновений и то, где объекты реагируют на столкновения при моделировании, обычно гораздо более требовательно.
Пары подходят к вам, обрисованные в общих чертах звучат многообещающе. Вы можете сохранить пары отсортированными при следующем столкновении и повторно вставить их, когда они столкнулись в соответствующих новых позициях. Вам нужно только отсортировать новый сгенерированный список коллизий (O (n lg n)) для двух объектов, а затем объединить два списка (новые коллизии для каждого объекта и существующий список коллизий, вставить новые коллизии, удалить их). устаревшие столкновения, в которых перечислены два объекта, которые столкнулись), то есть O (n).
Другим решением этой проблемы является адаптация вашего пространственного индекса для хранения объектов не строго в одном секторе, а в каждом, через который он прошел со времени последнего вычисления, и делать вещи дискретно. Это означает хранение быстро движущихся объектов в вашей пространственной структуре, и вам необходимо оптимизировать ее для этого случая.
Помните, что связанные списки или списки указателей очень плохо для кэширования на современных процессорах. Я бы рекомендовал вам хранить копии ваших кругов - их важные свойства для обнаружения столкновений с любой скоростью - в массиве (последовательная память) в каждом секторе любого пространственного индекса или в парах, которые вы обрисовали в общих чертах выше.
Как отмечает Марк в комментариях, распараллелить вычисления может быть довольно просто.