Podręcznik Grafika komputerowa i wizualizacja
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.
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 ;