Ключевыми словами обнаружения столкновений здесь являются «непрерывный» или «не непрерывный».
Как и в некоторых других ответах, большинство современных библиотек столкновений используют непостоянную версию, потому что анализировать точное время столкновения для многих форм столкновений является дорогостоящим. Это означает, что вы позволяете объектам проникать, обнаруживать это, а затем регулировать их скорости, чтобы противодействовать взаимопроникновению. И, как уже было отмечено, это позволяет быстро движущимся объектам проходить друг через друга. Это решается путем увеличения частоты запуска физики, по сути, вам необходимо отделить ее от рендеринга (запустить ее, используя гораздо более быстрый таймер). Фактический способ решения проблемы взаимопроникновения и т. Д. Находится в поле зрения другого вопроса.
Однако для кругов тот факт, что вы можете аналитически определить точное время столкновения для любой пары окружностей с постоянной (или ускоряющей) скоростью, дает вам возможность проводить непрерывное обнаружение столкновений в этом конкретном случае. Это был бы хороший проект, но я не уверен, что это правильный путь, так как вы можете внезапно захотеть включить другие фигуры, и тогда вы застряли. Формулы, которые вы должны решить, уже опубликованы в качестве ответа.
Я хотел бы добавить здесь помимо суммирования двух методов, поскольку вы, похоже, очень обеспокоены скоростью обработки «современной вычислительной системы», является то, что компьютеры теперь невероятно быстро выполняют любые из этих вычислений даже наивным способом. проверки всех пар окружностей, если вы несколько оптимизируете внутренний код. Вы, вероятно, не испытываете никаких проблем с увеличением скорости физики по сравнению с рендерингом и для решения не непрерывного случая больших скоростей.
Что добавляет прерывательный механизм, чтобы избежать парной проверки всех объектов, так это использование некоторой структуры данных для отслеживания объектов, их общего положения и занятости в пространстве для обнаружения потенциальных перекрытий без необходимости проверить каждый объект против каждого объекта. Это называется broadphase в магазине. Вам определенно необходимо реализовать что-то подобное в конце концов, если вы начнете увеличивать количество объектов. Вы не указываете, какое «большое» количество кругов или на какой процессор вы нацеливаете, так что, надеюсь, вы можете пропустить это и сделать это простым способом для начала, но сложно сказать, если вы не опубликуете свой вариант использования.
Bottomline : Я бы выбрал испытанный и не проверенный тип непрерывного двигателя на достаточной физической частоте, чтобы избежать случая пропуска с высокой скоростью, и не беспокоиться о производительности. Если вы действительно заинтересованы в написании кода для игры и не хотите заботиться о деталях, вы можете просто использовать некоторые из существующих библиотек 2D-физики, например Chipmunk или Box2D * 1020. *. Я не знаком с их реализациями, но уверен, что они также являются хорошим способом изучения предмета, если вы изучаете код.