Rozdział 3. ELEMENTY GEOMETRII OBLICZENIOWEJ

3.7. Podział wielokąta na trójkąty


Rys.3.12. Podział na trójkąty:  a) wielokąta wypukłego b) wielokąta typu gwiazda.
Wielokąt typu gwiazda jest wielokątem, dla którego można pokazać taki punkt wewnątrz,
którego połączenie odcinkiem z dowolnym wierzchołkiem jest całkowicie zawarte w wielokącie.


Podział wielokąta na trójkąty (triangulacja wielokąta) jest zadaniem mniej lub bardziej skomplikowanym w zależności od kształtu wielokąta, jaki jest analizowany. W szczególności dla wielokąta wypukłego lub typu gwiazda zadanie staje się banalnie proste (rys. 3.12). Dla wielokąta wypukłego wystarczy wskazać dowolny wierzchołek, a następnie połączyć go odcinkami z pozostałymi wierzchołkami, poza sąsiednimi. Czytelnik może zaproponować postępowanie w przypadku wielokąta typu gwiazda. Rozwiązania te nie mogą mieć zastosowania dla wielokątów dowolnych (w szczególności wklęsłych innych niż typu gwiazda), dla których podział na trójkąty staje się zadaniem bardziej skomplikowanym.

Innym przypadkiem wielokąta dla którego można wskazać dość prosty i efektywny algorytm podziału na trójkąty jest wielokąt monotoniczny.


Rys.3.13. Dla wielokąta monotonicznego można wskazać taką prostą,
że rzutowanie wierzchołków na tę prostą zachowuje ich kolejność (w dwóch łańcuchach).



Innym przypadkiem wielokąta dla którego można wskazać dość prosty i efektywny algorytm podziału na trójkąty jest wielokąt monotoniczny.


Niech dany będzie wielokąt zwykły o n węzłach P1...Pn,Pn+1 = P1 . Wielokąt nazywamy monotonicznym, jeżeli istnieje prosta l taka, że rzuty prostokątne wierzchołków Pi na l są uporządkowane w dwóch grupach w takiej samej kolejności jak punkty Pi (rys.3.13).

Rys.3.14. Podział na trójkąty wielokąta monotonicznego zgodnie z zaproponowanym algorytmem.
Czytelnik może prześledzić kolejne kroki łączenia wierzchołków.


ALGORYTM PODZIAŁU WIELOKĄTA MONOTONICZNEGO
1. utwórz jedną posortowaną listę wierzchołków (rys.3.14) ;
2. P1 na stos ; P2, na stos ;    niech R1, R2 ... Ri  oznacza aktualną zawartość stosu
3. for (j=3,4,... n) do
4.             if (Pj sąsiaduje z R1, ale nie z Ri) then
                            połącz: PjR2, PjR3 ... PjRi ;
                            wyzeruj stos ;
                            Ri na stos ; Pj na stos ;
                else
5.             if (Pj sąsiaduje z Ri ale nie z R1) then
                            begin
                                        LOOP:   if (i=1 lub wewnętrzny kąt Ri >=180o) then
                                                               Pj na stos ;
                                                    else
                                                                begin
                                                                           połącz PjRi-1 ;
                                                                           zdejmij Ri ze stosu ;
                                                                           i=i-1 ;
                                                                           go to LOOP ; 
                                                               end
                            end
                else
6.             if (Pj sąsiaduje z R1 i Pj sąsiaduje z Ri) then
                            połącz PjR2, PjR3 ... PjRi-1 ;


Przedstawiony algorytm triangulacji wielokąta monotonicznego jest algorytmem przeglądania wierzchołków zgodnie z ich kolejnością wynikającą z monotoniczności. Jednocześnie branie pod uwagę kolejnego wierzchołka jest związane z połączeniem go z innym wierzchołkiem tak, aby „odciąć” trójkąt. Ze względu na wzajemne położenie wierzchołków możliwe są trzy różne (i wykluczające się !) konfiguracje. Kroki 4., 5. i 6. algorytmu opisują postępowanie w odpowiednich przypadkach. Czytelnik może przeanalizować geometrię rozpatrywanych konfiguracji wierzchołków. W książce M.Jankowskiego [6] można znaleźć szczegóły przedstawionego algorytmu.

Warto zwrócić uwagę na problem złożoności obliczeniowej triangulacji wielokąta monotonicznego. Monotoniczność zapewnia odpowiednie posortowanie wierzchołków. A zatem krok 1. algorytmu nie wymaga sortowania. W związku z tym asymptotyczna złożoność obliczeniowa całego algorytmu wynosi O(n).

 

Przedstawiony algorytm triangulacji nie zapewnia możliwości podziału na trójkąty dowolnego wielokąta. Istnieje jednak twierdzenie, które mówi, że dowolny wielokąt można rozciąć na sumę wielokątów monotonicznych.

Rozpatrzmy wielokąt wklęsły, który nie jest monotoniczny. Jeśli przetniemy go prostymi równoległymi przechodzącymi przez wszystkie wierzchołki (rys.3.15), to można przeprowadzić analizę, które wierzchołki „psują” monotoniczność. Rozpatrzmy pasy (warstwy) pomiędzy sąsiednimi prostymi tnącymi. Jeśli prosta brzegowa pasa przechodzi przez wierzchołek wielokąta, to mogą zaistnieć dwa przypadki. Albo krawędź wielokąta wychodząca z tego wierzchołka przecina pas (P1 na rys.3.15), albo nie (P2 na rys.3.15). W tym drugim przypadku mamy do czynienia z ekstremum lokalnym, które „psuje” monotoniczność. W takiej sytuacji należy połączyć ten wierzchołek z dowolnym wierzchołkiem po drugiej stronie pasa. Połączenia mogą być dowolne i wielokrotne, ale istotne jest aby każdy wierzchołek „psujący” monotoniczność w danym pasie był przynajmniej raz połączony z wierzchołkiem z przeciwległego brzegu (prostej) pasa. Każde, tak wykreowane połączenie rozcina wielokąt.


ALGORYTM PODZIAŁU NA WIELOKĄTY MONOTONICZNE
1. posortuj wierzchołki wielokąta pod względem współrzędnej y ;
2. przetnij wielokąt prostymi równoległymi do osi OX przechodzącymi przez
                wszystkie wierzchołki ;
3. for each pas Wi  do
4.             for each wierzchołek Pj na brzegu pasa Wi  do
5.                         if Pj psujący monotoniczność then
                                        połącz Pj z dowolnym wierzchołkiem na drugim brzegu
                                                    pasa Wi. Połączenie to rozcina wielokąt.

 

Rys.3.15. Rozcięcie wielokąta na wielokąty monotoniczne. Po połączeniu punktów „psujących”
z wierzchołkami po drugiej stronie pasa (zielone odcinki) powstają trzy wielokąty monotoniczne.


Posortowanie wierzchołków w 1. kroku algorytmu ułatwia późniejsze wyszukiwanie odpowiednich wierzchołków i jednocześnie powoduje, że rozcięte w wyniku działania algorytmu wielokąty monotoniczne mają również posortowane wierzchołki. Oczywiście asymptotyczna złożoność obliczeniowa algorytmu podziału na wielokąty monotoniczne wynosi O(nlogn.

 

Biorąc pod uwagę przedstawione algorytmy podziału, można zaproponować rozwiązanie dwuetapowe zadania triangulacji wielokąta dowolnego:

 

ALGORYTM TRIANGULACJI WIELOKĄTA
1. podziel wielokąt na wielokąty monotoniczne ;
2. podziel na trójkąty wielokąty monotoniczne ;

 

Złożoność obliczeniowa tak sformułowanego algorytmu podziału na trójkąty wynika bezpośrednio z analizy jego elementów składowych. Asymptotyczna złożoność obliczeniowa zaproponowanego algorytmu triangulacji dowolnego wielokąta wynosi O(nlogn) .