Пересечение многоугольников (PSLG overlaying) — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 4: Строка 4:
 
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]
 
[[Файл:PSLG.png|400px|thumb|left|Ну как то так. Очевидно же]]
  
===Алгоритм===
+
==Алгоритм==
MapOverlay (S1, S2)
+
MapOverlay (<tex>S_1</tex>, <tex>S_2</tex>)
 
Дано: 2 ППЛГ в виде РСДС.
 
Дано: 2 ППЛГ в виде РСДС.
 
Вывод: пересечение этих ППЛГ в виде РСДС.
 
Вывод: пересечение этих ППЛГ в виде РСДС.
 
Алгоритм:
 
Алгоритм:
1. Копируем S1 и S2 в РСДС D.
+
1. Копируем <tex>S_1</tex> и <tex>S_2</tex> в РСДС <tex>D</tex>.
  
2. Находим все пересечения ребер из S1 с ребрами из S2 с помощью заметающей прямой.
+
2. Находим все пересечения ребер из <tex>S_1</tex> с ребрами из <tex>S_2</tex> с помощью заметающей прямой.
  
2.1 Когда находим точки пересечения, то обновляем D.
+
2.1 Когда находим точки пересечения, то обновляем <tex>D</tex>.
  
2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в D.
+
2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в <tex>D</tex>.
  
3. Теперь D это нормальный РСДС, но без информации о faces.
+
3. Теперь <tex>D</tex> это нормальный РСДС, но без информации о faces.
  
4. Находим boundary cycles в D.
+
4. Находим boundary cycles в <tex>D</tex>.
  
5. Создаем граф G, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).
+
5. Создаем граф <tex>G</tex>, в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).
  
 
6. Для каждой компоненты графа:
 
6. Для каждой компоненты графа:
  
7. Пусть С будет уникальная наружная граница цикла в компоненте, а f будет означать face ограниченный этим циклом. Создадим face для f. Запишем outer_component в какой-нибудь half-edge из C. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на f.
+
7. Пусть <tex>С</tex> будет уникальная наружная граница цикла в компоненте, а <tex>f</tex> будет означать face ограниченный этим циклом. Создадим face для <tex>f</tex>. Запишем outer_component в какой-нибудь half-edge из <tex>C</tex>. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на <tex>f</tex>.
  
 
==Q&A==
 
==Q&A==

Версия 22:43, 7 января 2014

Эта статья находится в разработке!

Вычисление пересечения двух многоугольников представленных в виде РСДС

Ну как то так. Очевидно же

Алгоритм

MapOverlay ([math]S_1[/math], [math]S_2[/math]) Дано: 2 ППЛГ в виде РСДС. Вывод: пересечение этих ППЛГ в виде РСДС. Алгоритм: 1. Копируем [math]S_1[/math] и [math]S_2[/math] в РСДС [math]D[/math].

2. Находим все пересечения ребер из [math]S_1[/math] с ребрами из [math]S_2[/math] с помощью заметающей прямой.

2.1 Когда находим точки пересечения, то обновляем [math]D[/math].

2.2 Сохраняем half-edge слева от event point в vertex, содержащемся в [math]D[/math].

3. Теперь [math]D[/math] это нормальный РСДС, но без информации о faces.

4. Находим boundary cycles в [math]D[/math].

5. Создаем граф [math]G[/math], в котором узлы будут отвечать за boundary cycles и в котором ребра будут соединять только те узлы, один из которых будет являться границей дыры, а другой будет находиться слева от самой левой точки первого. (В случае, если это самая внешняя граница, то для нее пусть будет мнимая гигантская граница, с которой мы ее и соединим).

6. Для каждой компоненты графа:

7. Пусть [math]С[/math] будет уникальная наружная граница цикла в компоненте, а [math]f[/math] будет означать face ограниченный этим циклом. Создадим face для [math]f[/math]. Запишем outer_component в какой-нибудь half-edge из [math]C[/math]. И создадим список inner_components, состоящий из указателей на какой-нибудь half-edge из каждого цикла. А так же пусть incident_face в каждом half-edge будут обновлены на [math]f[/math].

Q&A