Если вы, как уже предлагалось, представляете растущие круги вертикальными конусами в 3d, то вы можете разделить пространство как регулярную (может быть шестиугольную) сетку упакованных вертикальных цилиндров.Для каждого цилиндра вычислите минимальные и максимальные высоты (времена) пересечений со всеми конусами.Если центр круга (вершина конуса) находится внутри цилиндра, то минимальное время равно нулю.Затем сортируйте конусы по минимальному времени пересечения.В результате такой индексации для каждого цилиндра у вас будет упорядоченная последовательность записей с 3 значениями: минимальное время, максимальное время и номер круга.
Когда вы проверяете некоторую точку в трехмерном пространстве, вы берете цилиндр, которому она принадлежит, и повторяете его последовательность, пока сохраненное минимальное время не превысит время данной точки.Все полученные конусы, максимальное время которых также меньше заданного времени, гарантированно содержат заданную точку.Только конусы, где заданное время лежит между минимальным и максимальным временем пересечения, необходимы для пересчета.
Существует классический компромисс между индексированием и затратами времени выполнения: чем меньше диаметр цилиндра, тем меньше диапазон пересечений, поэтому в каждой точке требуется пересчет меньшего числа конусов, но нужно индексировать больше цилиндров.Если центры окружностей распределены неравномерно, то, возможно, стоит поискать лучшую конфигурацию размещения цилиндров, чем обычную сетку.
PS Мой первый ответ здесь - только что зарегистрировался, чтобы опубликовать его.Надеюсь, еще не поздно.