Это похоже на проблему оптимизации пограничной проверки для большого количества предметов. Подход линейности не слишком хорошо масштабируется для тысяч кругов.
Это хорошая тема для чтения в сети. Но сначала, не дойдя туда, я попытаюсь объяснить (как упражнение) то, что я буду исследовать. Я бы создал двоичное дерево и разделил пространство, вместо этого вместо массива я бы поставил точки окружности в такое дерево. Глядя на элементы дерева, которые ближе к фактическому местоположению X, Y, становится предметом двоичного поиска на дереве. В результате этого поиска у вас есть самая близкая точка, и вы можете проверить на нее конфликт. Для алгоритма еще нужно сделать, и необходимы дальнейшие оптимизации. Например, как проверить больше очков, а не только окончательный? Потенциально мне нужно дерево для координаты X, другое для координаты Y и т. Д. Но я бы изучил эти идеи. Я вернусь к этому сообщению и расширю свой ответ с помощью фактического примера и более конкретного решения.