powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выбрать полигоны, в которые входит точка
14 сообщений из 14, страница 1 из 1
Выбрать полигоны, в которые входит точка
    #39622881
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не используя гис и т.п. нужен алгоритм
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39622921
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PtInRegion()
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39622957
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachне используя гис и т.п. нужен алгоритм
Если полигоны выпуклые - то легко. Для всех полигонов задается
направление обхода (например по часовой стрелке). Далее решается
уравнение типа "положение точки относительно прямой" для каждого
отрезка из образующих полигон. (Метод 1)

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

Вогнутые полигоны можно представить логической суперпозицией двух выпуклых А и Б.
При этом решать булево выражение типа A и не-Б.

Еще есть метод дробления полигона на набор выпуклых трапеций. Для трапеции
поиск попадания - тривиален. Плюс тут можно делать всякие оптимизации
по скорости. (Метод 3). Для методов 1 и 3 возможны еще оптимизации
по методу BSP деревьев (если ищется скоростное решение).

Плюс для всех-всех методов имеет смысл строить выпуклый BoundingVolume
и делать тривиальные оптимизации.

Из экзотики еще есть метод основанный на интеграле по контуру для
кусочно-линейной функции но я его не помню. Кодил когда-то на Basic как
самый первый метод инженерной графики.
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39622991
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕще есть метод дробления полигона на набор выпуклых трапеций.Или триангуляция полигона - она, кстати, и попроще будет.
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39623572
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЕсли полигоны выпуклые - то легко. Для всех полигонов задается
направление обхода (например по часовой стрелке). Далее решается
уравнение типа "положение точки относительно прямой" для каждого
отрезка из образующих полигон. (Метод 1)

Для выпуклых есть более простой алгоритм Грэхема: обходим точки границы по/против часовой и считаем знак векторного произведения с базой в точке. Если она внутри, знак будет постоянным.
А для невыпуклых с возможными пакостями типа самопересечения/дырок внутри нифига аналитические методы работать не будут.
Проще тупо перебрать все составные сегменты или прямоугольники, как винда делает.
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39623576
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я надеюсь что у автора нет дырявых.
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39623661
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шикин и Боресков - Комп. Графика - 8.5. Проверка принадлежности точки многоугольнику.

Описана реализация на С++.
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39623673
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо.
но вопрос был не "принадлежность точки полигону", а "выбрать все полигоны, в которые входит точка".

понятно, что итерация по всем полигонам и проверка "входит" решает задачу. нужно что-то более эффективное

mayton ,
дырявых нет
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39623680
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bach, на алгоритм сильно влияет следующее.

Будут-ли полигоны часто обновляться? Если нет - то можно индексировать пространство
через BSP/Quad/R-Tree. И решать задачу по индексу. При этом индексировать мы будем
не сами полигоны а их пересечения. Тоесть если полигоны A и Б частично перекрываются
то в индекс попадает узлы:
1) Только A
2) А и Б
3) Только Б

Для большего числа полигонов будет соотв более сложные комбинации (worst-case - для N
полигонов нам придется проиндексировать 2 в степени N узлов индеса). Обновление подобных
структур данных затруднено но зато поиск - поиск логарифмичен.

Если пространство дискретное (пиксели) то возможно нам подойдет даже связка координат - и
ссылки на объекты представляющие полигон.

(1,1) -> A
(1,2) -> A,B

Вобщем как видите - нету сферического алгоритма. Нужно знать постановку. Причем чем детальнее
тем лучше.
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39623702
L1G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
простой способ ускорить перебор:
для всех полигонов предрассчитывать габариты (минимумы и максимумы координат всех точек одного полигона)
тогда при полном переборе можно будет без полной проверки отбрасывать те, минимумы которых больше координат точки или максимумы меньше
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39623724
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это и есть BoundingVolume или BoundingBox
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39625198
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonlove_bach, на алгоритм сильно влияет следующее.

Будут-ли полигоны часто обновляться? Если нет - то можно индексировать пространство
через BSP/Quad/R-Tree. И решать задачу по индексу. При этом индексировать мы будем
не сами полигоны а их пересечения. Тоесть если полигоны A и Б частично перекрываются
то в индекс попадает узлы:
1) Только A
2) А и Б
3) Только Б

Для большего числа полигонов будет соотв более сложные комбинации (worst-case - для N
полигонов нам придется проиндексировать 2 в степени N узлов индеса). Обновление подобных
структур данных затруднено но зато поиск - поиск логарифмичен.

Если пространство дискретное (пиксели) то возможно нам подойдет даже связка координат - и
ссылки на объекты представляющие полигон.

(1,1) -> A
(1,2) -> A,B

Вобщем как видите - нету сферического алгоритма. Нужно знать постановку. Причем чем детальнее
тем лучше.

а не подскажите, как Вы видите алгоритм индексации полигонов?
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39625208
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же написал выше. Bsp, Quad. Это и есть алгоритмы индексации пространства.
...
Рейтинг: 0 / 0
Выбрать полигоны, в которые входит точка
    #39625234
Соколинский Борис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachпонятно, что итерация по всем полигонам и проверка "входит" решает задачу. нужно что-то более эффективное

Для эффективности я бы сразу для каждого полигона составил дескриптор:
список углов, составляющих выпуклую оболочку (С 0 )

списки углов, составляющие дополнения к выпуклой оболочки (невыпуклые дополнения разбиваются на треугольники (С 1 , С 2 ...)
Тогда задача поиска принадлежности решается быстро - точка должна входить в C 0 и не входить в C 1 ...C N
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Выбрать полигоны, в которые входит точка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]