Посоветуйте алгоритм: лежит ли точка внутри многоугольника?

onyxis

Все происходит на плоскости. Есть массив координат вершин многоугольника. Пусть будет упорядоченным, т.е. соседние элементы массива соответствуют соседним точкам многоугольника, последний элемент массива - соседний с первым. Многоугольник скорее всего выпуклый (хотя не факт). Есть ли какие-нибудь эффективные алгоритмы определения того, лежит ли точка внутри выпуклого/невыпуклого многоугольника? А также алгоритмы, не требующие упорядоченности массива точек.

dangerr

Я в алгоритмах не силён, но на правах КО: если многоугольник невыпуклый, а массив неупорядочен, но он может быть задан неоднозначно. Поэтому, очевидно, этого алгоритма быть не может для таких данных.

vall

то что с ходу помню
* считается чётность пересечения рёбер с лучом пущенным из точки в произвольную сторону, есть тонкость когда луч попадает на вершину
* считается суммарная площадь всех треугольников образованных ребрами и этой вершиной и сравнивается с площадью многоугольник, афаик работает только для выпуклых многоугольников. для
невыпуклых это проверяет что-то другое.
это всё требует упорядоченности.
если мне не изменяет мой склероз в "Особенности национальных задач по информатике" была какая-то неплохая глава про такую простую вычислительную геометрию

yroslavasako

для выпуклых можно посмотреть на совпадение всех знаков векторного произведения

vall

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

iravik

del

Serab

вот, кстати, там у тебя в комментах дали ссылочку на статью, где разбираются эти самые тонкости, которые у тебя не упомянуты.
http://algolist.manual.ru/maths/geom/belong/poly2d.php

Devid

есть тонкость когда луч попадает на вершину
Еще луч может содержать сторону многоугольника. Если многоугольник рисуется людьми, то это вполне вероятно.

Serab

Еще луч может содержать сторону многоугольника. Если многоугольник рисуется людьми, то это вполне вероятно.
да, это все просто обрабатывается, в статье на алголисте написано.

vall

логично что в этом случае он и в вершину попадёт. даже в две. так что это часть того частного случая.

onyxis

Всем спасибо. Думаю, мне подойдет алгоритм, считающий четность пересечений.

aoand

Думаю, мне подойдет алгоритм, считающий четность пересечений.
Таким лучше пользоваться только для невыпуклых.
Если все же у тебя выпуклый многоугольник, то проверять принадлежность точки внутренности можно с логарифмической сложностью — если точек для проверки и сторон много, то это сильно поможет со скоростью. Идея: соединим центр масс многоугольника лучами с вершинами и получим набор секторов; двоичным поиском по полярному углу найдем сектор, в который попадает проверяемая точка, а потом посмотрим, попадает ли она в треугольник, соответствующий сектору.

Devid

центр масс многоугольника
Это уже линейная сложность.

lubanj

имеется ввиду для случая, когда поступает много запросов "лежит ли точка внутри одного и того же многоугольника?"

ppplva

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

aoand

Это уже линейная сложность.
Во-первых, правильно заметил, что такой алгоритм имеет смысл для случая, когда надо для многих точек проверять их принадлежность многоугольнику, иначе меньше линейной сложности не получить — прочесть-то координаты вершин все равно надо.
Во-вторых, в указанной тобою части линейной сложности нет: чтобы делать двоичный поиск по углу, нам даром не надо знать полярные углы, под которыми видны вершины из центра масс (более того, это даже вредно ввиду того, что полярный угол хорошо определяется только на плоскости с вырезом по полуоси). Для того, чтобы делать поиск, надо только уметь отвечать на вопрос "левее или правее сектора находится точка", а это делается, исходя из знаков соответствующих ориентированных площадей.
To : да, подойдет кто угодно из внутренности или даже границы.
Оставить комментарий
Имя или ник:
Комментарий: