определить, находится ли заданная точка внутри многоугольника - PullRequest
6 голосов
/ 07 марта 2011

Учитывая выпуклый многоугольник как список против часовой стрелки из n вершин, дайте алгоритм O (lgn), чтобы определить, находится ли данная точка внутри многоугольника.Предположим, что основные операции принимают O (1).

Я считаю направление, которое: если точка находится внутри выпуклого многоугольника, каково особое отношение между точками и всеми вершинами или ребрами?Кроме того, я предполагаю, что уловка здесь - выпуклый многоугольник, который делает алгоритм lgn.

Ответы [ 3 ]

12 голосов
/ 07 марта 2011

Единственное решение этой проблемы, о котором я знаю, требует O(n) полигона предварительной обработки времени. После этого каждая точка запроса для предварительно обработанного многоугольника обрабатывается за O(lg n) времени.

Просто возьмите точку P внутри многоугольника (назовем это «полюсом») и для каждой вершины нарисуйте луч, выходящий из P и проходящий через вершину. Считайте, что это полярная система координат с началом в P, причем вся полярная плоскость разделена на сектора этими лучами. Теперь, учитывая вашу точку запроса, вам просто нужно преобразовать ее в полярные координаты с началом координат на нашем полюсе P. Затем просто выполните бинарный поиск, чтобы определить конкретный сектор, содержащий точку запроса. Заключительная внутренняя / внешняя проверка внутри сектора (проверка точки и края) является тривиальной операцией O(1). Каждый запрос обрабатывается за O(lg n) время, необходимое для двоичного поиска.

Этот подход будет работать с большим классом полигонов, чем просто выпуклыми. Он охватывает класс так называемых звездных многоугольников, то есть многоугольников, у которых есть точка, из которой вся внутренность многоугольника может быть "видна" или "наблюдаема".

Время предварительной обработки O(n) обусловлено необходимостью заранее определить местоположение полюса.

P.S. Я увлекся размышлениями о более общем случае. Если ваш многоугольник выпуклый, вы можете просто использовать любую из его вершин в качестве полюса. Таким образом, вы сразу получаете алгоритм O(lg n), предварительная обработка не требуется.

1 голос
/ 24 ноября 2011

Вы можете проверить эту ссылку с подробной информацией о том, как определить, находится ли точка внутри сложного многоугольника, включая образец кода (c).

http://alienryderflex.com/polygon/

0 голосов
/ 07 марта 2011

Условием для нахождения точки внутри многоугольника является то, что точка должна быть на одной стороне всех отрезков. Вы должны проверить на знак расстояния рассматриваемой точки с каждым отрезком линии, составляющим многоугольник - если все совпадают, знак находится внутри многоугольника. Поиск в Google должен дать вам много алгоритмов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...