Трудное домашнее задание, а?
Возможно, хорошим началом может быть рассмотрение алгоритмов поиска путей в ширину - может быть, для этого будет полезен какой-то подобный подход с заливкой?
Редактировать: Так что если это просто выглядит как домашнее задание, может быть, я могу быть более полезным ...
Сначала я хотел бы определить прямоугольник, содержащий линию и точки, которые могут быть внутри нее, так как это может позволить нам избавиться от большого количества точек, которые находятся далеко от нашей линии.
Для каждой точки вы можете создать квадрат, представляющий список точек в радиусе этой точки. Это снова способ сокращения количества элементов для поиска.
К сожалению, я не знаю достаточно геометрии, чтобы знать, как правильно определить, находится ли список точек внутри или снаружи круга, помимо простого вычисления расстояния между ними и центром круга с помощью базового триггера. Я уверен, что есть один. Используя упомянутое выше простое подразделение или какой-либо другой вариант, вы обнаружите, что вы можете упреждающим образом сократить количество возможных точек, которые необходимо найти.
Также, если вы сохраняете все свои точки для поиска в одном списке и удаляете те, которые являются попаданиями для первого круга, когда дело доходит до измерения последующих фигур. Я использовал версию этого перебора для простой проверки почтового индекса на основе данных о местоположении - это задокументировано во многих местах в Интернете, но запуск его по пути, вероятно, будет довольно вычислительно дорогим.
Этот геометрический подход, вероятно, был бы лучше для ситуации, когда вы не выполняли много повторных поисков - если их много, вы можете организовать свои мосты в сеть, чтобы вы могли использовать стандартный поиск пути на их. Было бы целесообразно сделать несколько прототипов, чтобы увидеть, какой из них более эффективен, но я ожидаю, что если вы создадите подходящую сеть для представления ваших данных, вы сможете более гибко подходить к ее поиску.