notatka
Transkrypt
notatka
Twierdzenie o galerii sztuki Triangulacje Wykład 3 – inform. uzupełniające 2006/10/16 Graf dualny do triangulacji Dane: triangulacja T wielokąta P Graf dualny G: – wierzchołki G – trójkąty triangulacji T – krawędzie G: wierzchołki v i u połączone krawędzią wtw gdy odpowiadające im trójkąty mają wspólną krawędź – dla nieskończenie wielu n istnieją proste wielomiany o n wierzchołkach, które wymagają n/3 kamer, aby każdy punkt wielokąta był widoczny – dla każdego prostego wielokąta o n wierzchołkach, n/3 kamer wystarczy aby każdy punkt wielokąta był widoczny gdzie prosty wielokąt to wielokąt „bez dziur”. Rodzaje wierzchołków – startowy (start) – obaj sąsiedzi znajdują się niżej, kąt wewnętrzny mniejszy od π – końcowy (end) – obaj sąsiedzi wyżej, kąt wewnętrzny mniejszy od π – rozdzielający (split) – obaj sąsiedzi niżej, kąt wewnętrzny większy od π – łączący (merge) – obaj sąsiedzi niżej, kąt wewnętrzny większy od π – regular - pozostałe Lemat Prosty wielokąt P jest y-monotoniczny wtw gdy P nie zawiera żadnych wierzchołków typu split i merge. Szczegóły algorytmu Dane: wierzchołki v1,..., vn, krawędzie e1,...,en gdzie ei zaczyna się w vi Algorytm dzielący na wiel. y-monotoniczne: – miotła idąca z góry na dół – H – punkty zdarzeń (końce odcinków), porz. y – V – krawędzie przecinające miotłę, porz. wsp. x Df. Wielokąt y-monotoniczny: część wspólna każdej poziomej prostej i wielokąta jest spójna. Szczegóły algorytmu podziału Algorytm: – utwórz H (z końców odcinków, wg wsp. mal. y) – Aż do wyczerpania elementów H: • usuń kolejny element vi z H • stwierdź typ wierzchołka vi • wywołaj odpowiednią procedurę dla vi. HandleStartVertex( vi ) – wstaw krawędź ei do do V, ustaw • helper(ei) ← vi Szczegóły algorytmu HandleEndVertex(vi) 1. jeśli helper(ei-1) jest merge vertex 1. dodaj do D przekątną (vi, helper(ei-1)) 2. usuń ei-1 z V HandleSplitVertex(vi) 1. znajdź w V krawędź bezp. na lewo od vi: ej 2. Wstaw przekątną (vi, helper(ej)) do D 3. helper(ej) ← vi 4. wstaw ei do V 5. helper(ei) ← vi Szczegóły algorytmu HandleMergeVertex(vi) 1. jeśli helper(ei-1) jest typu merge Szczegóły algorytmu HandleRegularVertex(vi) 1. jeśli wnętrze P jest na prawo od vi 1. wstaw przek. (vi, helper(ei-1)) do D 2. Usuń ei-1 z V 3. Znajdź w T kraw. ej: bezp. na lewo od vi 4. jeśli helper(ej) jest merge vertex 1. wstaw przek. (vi, helper(ej)) do D 1. jeśli helper(ei-1) jest merge vertex 1. wstaw przekątną (vi, helper(ei-1)) do D 2. usuń ei-1 z V 3. wstaw ei do V oraz ustaw helper(ei)←vi 2. w przeciwnym razie 1. znajdź w V ej: krawędź bezp. na lewo od vi 5. helper(ej) ← vi Triangulacja wiel. monotonicznego TriangulateMonotonePolygon( P ) Dane: y-monotoniczny wielomian w postaci podwójnej listy krawędzi Wynik: triangulacja P w postaci podw. listy krawędzi Dodatkowa struktura danych: stos wierzchołków S 1. Rozdziel P na lewy brzeg (L) i prawy brzeg (P), uporz. wg wsp. y 2. Połącz uporz. ciągi L i P w jeden uporz. ciąg: u1, ..., un 3. Dodaj u1 i u2 do stosu S 4. Dla j = 3,...,n: 1. HandleVertex( uj ) Rola stosu S: wierzchołki, których jeszcze nie można było „striangulować” 1. jeśli helper(ej) jest merge vertex 1. wstaw przek. (vi, helper(ej)) do D 2. helper(ej) ← vi HandleVertex( uj ) Jeśli uj i top(S) są na różnych brzegach P (lewy/prawy): – zdejmij wszystkie wierzchołki z S oraz – połącz je nowymi przekątnymi z uj [nie łącz ostatniego el.S] – dodaj u(j-1) i uj do S w przeciwnym razie: – zdejmij jeden element z S – dopóki odcinek (top(S), uj) wewnątrz P: • • – – dodaj przekątną (top(S), uj) do D zdejmij top(S) z S ostatni zdjęty z S wierzchołek dodaj do S dodaj uj do S Poprawność Przypadek 1: nowy wierzch. z innej str.niż S Niezmienniki TriangulateMonotonePolygon: • dodawane krawędzie „odcinają” striangulowaną część od pozostałego y-monotonicznego wielokąta • wierzchołki w S to kolejne wierzchołki na jednym z brzegów, odpowiadają im kąty wklęsłe w P elementy S powyżej już striangulowane (zdejmujemy) uj Przypadek 2.1: nowy wierzch. z tej samej str. elementy S powyżej już striangulowane Przypadek 2.2: nowy wierzch. z tej samej str. elementy S powyżej już striangulowane (zdejmujemy) uj uj