Пересечение многоугольников (PSLG overlaying) — различия между версиями
Tiss93 (обсуждение | вклад) |
Tiss93 (обсуждение | вклад) |
||
Строка 6: | Строка 6: | ||
==Алгоритм== | ==Алгоритм== | ||
MapOverlay (<tex>S_1</tex>, <tex>S_2</tex>) | MapOverlay (<tex>S_1</tex>, <tex>S_2</tex>) | ||
+ | |||
Дано: 2 ППЛГ в виде РСДС. | Дано: 2 ППЛГ в виде РСДС. | ||
+ | |||
Вывод: пересечение этих ППЛГ в виде РСДС. | Вывод: пересечение этих ППЛГ в виде РСДС. | ||
Алгоритм: | Алгоритм: | ||
+ | |||
1. Копируем <tex>S_1</tex> и <tex>S_2</tex> в РСДС <tex>D</tex>. | 1. Копируем <tex>S_1</tex> и <tex>S_2</tex> в РСДС <tex>D</tex>. | ||
Строка 14: | Строка 17: | ||
2.1 Когда находим точки пересечения, то обновляем <tex>D</tex>. | 2.1 Когда находим точки пересечения, то обновляем <tex>D</tex>. | ||
− | |||
− | |||
3. Теперь <tex>D</tex> это нормальный РСДС, но без информации о faces. | 3. Теперь <tex>D</tex> это нормальный РСДС, но без информации о faces. | ||
Строка 28: | Строка 29: | ||
==Q&A== | ==Q&A== | ||
+ | Копирование РСДС - просто объединение в одну структуру. Как сделать его правильным - это уже следующие пункты. | ||
+ | |||
+ | Как из пересечения ребер сделать новую компоненту РСДС - см рисунок. | ||
+ | |||
+ | Сколько будет faces? Столько же, сколько outer boudaries + 1. | ||
+ | |||
+ | Как узнать, что данный цикл это внешняя граница для face или же это дыра в нем? Мы знаем, что face находится слева от half-edge. Поэтому возьмем самую левую точку (в случаем, если их несколько, то самую нижнюю) и возьмем входящий и выходящий из нее half-edge. В случае угла между ними менее 180 градусов, то это внешняя граница, иначе это дыра. Это действует только для самой левой точки из цикла. | ||
+ | |||
+ | Че за граф такой пацанский? ну ваще он тащит. |
Версия 22:53, 7 января 2014
Вычисление пересечения двух многоугольников представленных в виде РСДС
Алгоритм
MapOverlay (
, )Дано: 2 ППЛГ в виде РСДС.
Вывод: пересечение этих ППЛГ в виде РСДС. Алгоритм:
1. Копируем
и в РСДС .2. Находим все пересечения ребер из
с ребрами из с помощью заметающей прямой.2.1 Когда находим точки пересечения, то обновляем
.3. Теперь
это нормальный РСДС, но без информации о faces.4. Находим boundary cycles в
.5. Создаем граф
, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).6. Для каждой компоненты графа:
7. Пусть
будет уникальная наружная граница цикла в компоненте, а будет означать face ограниченный этим циклом. Создадим face для . Запишем outer_component в какой-нибудь half-edge из . И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на .Q&A
Копирование РСДС - просто объединение в одну структуру. Как сделать его правильным - это уже следующие пункты.
Как из пересечения ребер сделать новую компоненту РСДС - см рисунок.
Сколько будет faces? Столько же, сколько outer boudaries + 1.
Как узнать, что данный цикл это внешняя граница для face или же это дыра в нем? Мы знаем, что face находится слева от half-edge. Поэтому возьмем самую левую точку (в случаем, если их несколько, то самую нижнюю) и возьмем входящий и выходящий из нее half-edge. В случае угла между ними менее 180 градусов, то это внешняя граница, иначе это дыра. Это действует только для самой левой точки из цикла.
Че за граф такой пацанский? ну ваще он тащит.