• Nie Znaleziono Wyników

Drzewa czwórkowe

W dokumencie Grafika komputerowa I – MIM UW (Stron 98-101)

8. Drzewa binarne, czwórkowe i ósemkowe

8.1. Drzewa czwórkowe

Rysunek 8.1. Podział kwadratu na boksy i odpowiadające mu drzewo czwórkowe.

Zaczniemy od przypadku najłatwiejszego do narysowania, a zatem najbardziej odpowied-niego do przedstawienia zasady. Przyjmiemy, że d = 2, a zatem kostka jest kwadratem (albo, ogólniej, prostokątem). Cała kostka jest reprezentowana przez korzeń drzewa. Kostkę i każdy boks dzielimy na cztery przystające kwadraty (lub prostokąty). Każdy wierzchołek drzewa, który nie jest liściem, ma cztery poddrzewa.

Drzewa czwórkowe można zastosować w naturalny sposób do rozwiązywania różnych zadań dwuwymiarowych, takich jak

— Przeszukiwanie obszarów, na przykład w geograficznej bazie danych, — Konstrukcyjna geometria figur płaskich,

— Algorytmy widoczności, — Transmisja obrazów,

— Wykrywanie kolizji w ruchu płaskim, np. w animacji.

Omówimy reprezentację płaskiej figury F , mieszczącej się w prostokącie. Z każdym wierz-chołkiem drzewa zwiążemy atrybut, zwany umownie kolorem. Wierzchołek jest

— czarny, jeśli wnętrze boksu reprezentowanego przez ten wierzchołek jest zawarte w figurze F , — biały, jeśli wnętrze boksu jest rozłączne z figurą F ,

— szary, jeśli przecięcie wnętrza boksu i brzegu figury F jest niepuste.

Nie ma powodu, aby dzielić wierzchołki czarne i białe, zatem są one zwykle liśćmi drzewa, a wszystkie wierzchołki wewnętrzne są szare. Istnieją też na ogół szare liście, co wynika z ogra-niczenia wysokości drzewa, które określa osiągalną dokładność reprezentowania figur. Można jednak umieścić w szarych liściach dodatkową informację, która pozwala na przykład zbadać, czy dany punkt, należący do boksu reprezentowanego przez szary liść, należy do F , czy nie. Informacja taka może być prostsza niż reprezentacja całej figury F .

Rysunek 8.2. Podział kwadratu na boksy dla pewnego wielokąta krzywoliniowego.

Przykład: Niech figura F będzie wielokątem krzywoliniowym, którego brzeg składa się z kil-ku krzywych sklejanych. Podział boksów wykonujemy do chwili, gdy w każdym boksie, który zawiera fragment brzegu, fragment taki składa się z co najwyżej dwóch połączonych łuków wielomianowych. Sprawdzenie, czy dany punkt p należy do F polega na odnalezieniu w drzewie liścia, który zawiera ten punkt, i jeśli ten liść jest szary, to zbadanie, po której stronie brzegu leży punkt p, jest dosyć łatwe.

8.1.1. Konstrukcyjna geometria figur płaskich

Drzewo reprezentujące dopełnienie figury reprezentowanej przez dane drzewo czwórkowe jest bardzo łatwe do otrzymania; wystarczy zamienić kolor każdego wierzchołka na przeciwny (tj. czarny na biały, biały na czarny, i szary na złoty). Przetwarzanie dodatkowej informacji o brzegu (jeśli taka jest) może polegać na zmianie orientacji krzywej brzegowej. Jeśli krzywa ta jest krzywą B´eziera, to wystarczy w tym celu ustawić jej punkty kontrolne w odwrotnej kolejności.

Mając drzewa reprezentujące dwie figury płaskie, zawarte w tej samej kostce, możemy skon-struować drzewo, które reprezentuje sumę, przecięcie lub różnicę tych figur. Dysponując proce-durą wyznaczającą dopełnienie figury, każdą z tych operacji możemy zrealizować za pomocą np. procedury wyznaczania przecięcia. Procedura ta opiera się na fakcie, że każdy boks może być reprezentowany tylko przez wierzchołki znajdujące się w identycznej pozycji w obu drzewach i w obu drzewach może być podzielony tylko w ten sam sposób.

Dzięki powyższej własności drzew, jest możliwe jednoczesne obejście metodą DFS wierz-chołków reprezentujących te same boksy. Przetwarzając wierzchołki, którym odpowiada ten sam boks, procedura sprawdza, czy to liście i bada ich kolory. Zależnie od wyniku tego bada-nia, procedura tworzy wierzchołek drzewa reprezentującego przecięcie i nadaje mu kolor, lub wykonuje działanie takie jak w poniższej tabelce:

↓ 1 2 → czarny liść biały liść szary liść poddrzewo czarny liść czarny liść biały liść szary liść 2 kopia poddrzewa 2 biały liść biały liść biały liść biały liść biały liść

szary liść szary liść 1 biały liść A B

poddrzewo kopia poddrzewa 1 biały liść B C

Procedura A: jeśli szare liście zawierają informację, która umożliwia dokładne odtworzenie przecięć boksu z figurami, to należy zbadać, czy te przecięcia są rozłączne. Jeśli tak, to procedura tworzy biały liść. W przeciwnym razie powstaje szary wierzchołek, który może być liściem albo korzeniem poddrzewa, jeśli informacja o brzegu przecięcia jest zbyt skomplikowana, aby można ją było przechowywać w liściu. Jeśli drzewa nie zawierają dodatkowej informacji, to procedura tworzy szary liść (albo biały); kolor tego liścia może być błędny.

Procedura B: jeśli nie ma dodatkowej informacji o przecięciu figur z boksem, to procedura tworzy szary liść. W przeciwnym razie szary liść jednego lub drugiego drzewa jest zamieniany na korzeń poddrzewa (zostaje ono rozbudowane przez dodanie czterech liści reprezentujących ćwiartki boksu); wierzchołki obu drzew, reprezentujące te ćwiartki, są następnie przetwarzane rekurencyjnie, za pomocą procedury C.

Procedura C: oba wierzchołki reprezentujące dany boks są wewnętrzne, mają więc wskaźniki do poddrzew reprezentujących ćwiartki boksu. Ćwiartki te przetwarzamy wywołując rekuren-cyjnie procedurę wyznaczania przecięcia.

Po wykonaniu działań zgodnie z powyższą tabelką i opisem, należy jeszcze uprościć wynik, jeśli się da. Jeśli wierzchołek reprezentujący przecięcie figur w boksie jest korzeniem poddrzewa i wszystkie jego poddrzewa są białymi (albo czarnymi) liśćmi, to usuwamy je i zamieniamy bieżący wierzchołek na biały (albo czarny) liść.

Przykład zastosowania: Przypuśćmy, że jedna z figur przedstawia obszar zalesiony, a druga obszar zabagniony. Ostoję puszczy (tzw. matecznik) możemy zlokalizować wyznaczając drzewo reprezentujące część wspólną tych obszarów.

8.1.2. Algorytm widoczności

Drzewo czwórkowe ma zastosowanie w następującym algorytmie widoczności (algorytmie Warnocka). Przypuśćmy, że mamy scenę trójwymiarową składającą się z płaskich wielokątów o co najwyżej wspólnych krawędziach. Algorytm jest następujący:

1. Rzutujemy krawędzie wielokątów na płaszczyznę obrazu; dostajemy zbiór rzutów krawędzi. 2. Tworzymy drzewo czwórkowe, którego korzeń reprezentuje cały obraz. Boks dzielimy na mniejsze wtedy, gdy jest większy niż jeden piksel, a w jego wnętrzu leży rzut jakiejś krawędzi (jest też wariant: więcej niż jednej krawędzi).

3. Dla każdego liścia znajdujemy środek boksu i rozstrzygamy widoczność w tym punkcie, tj. znajdujemy ścianę, której przecięcie z półprostą, której rzutem jest ten punkt, jest najbli-żej obserwatora. Cały boks wypełniamy kolorem tej ściany. W wariancie dopuszczającym obecność rzutu jednej krawędzi wewnątrz boksu reprezentowanego przez liść widoczność rozstrzygamy w dwóch punktach, leżących po przeciwnych stronach tej krawędzi i nadajemy kolory dwóm wielokątom powstałym z podziału boksu przez tę krawędź. Wariant ten działa szybciej, ponieważ wymaga przeszukiwania drzew o znacznie mniejszej wysokości.

8.1.3. Transmisja obrazów i MIP-mapping

Przypuśćmy, że należy przesłać pewien obraz w ten sposób, aby odbiorca mógł go niezbyt dokładnie wyświetlić po otrzymaniu niewielkiej ilości danych. Może wtedy przerwać transmisję przed końcem jeśli obraz mu się nie podoba i nie chce płacić za przesyłanie całości.

Metoda opisana niżej powoduje pewien wzrost objętości danych (o 1/3), ale ponieważ wiele algorytmów kompresji (bezstratnej) działa „po kolei” (tj. odtwarza zakodowany ciąg w kolejności uporządkowania jego elementów), więc to nie jest bardzo ważne.

1. Tworzymy drzewo pełne, którego liście to piksele, a każdy węzeł wewnętrzny ma kolor o war-tości średniej arytmetycznej kolorów korzeni poddrzew (kolor korzenia obliczamy na końcu), 2. Przesyłamy kolory wierzchołków drzewa w kolejności przeszukiwania drzewa algorytmem BFS, tj. najpierw korzeń, potem jego 4 poddrzewa, potem 16 ich poddrzew itd. Wyświetlanie polega na wypełnianiu stałym kolorem coraz mniejszych kwadratów.

Powyższy algorytm, jak łatwo zauważyć, polega na przesyłaniu kolejnych obrazów o rozdziel-czości 1 × 1, 2 × 2 itd., aż do oryginalnego obrazu na końcu (z pikselami poprzestawianymi w pewien sposób). Stąd bierze się wspomniany wzrost objętości danych. Zastanówmy się, jak go uniknąć.

Wydawało by się, że znając średnią arytmetyczną czterech liczb i trzy z nich, można ob-liczyć czwartą, a zatem można by nie przesyłać koloru jednego (np. ostatniego) z czterech poddrzew każdego wierzchołka. Tak jednak nie jest z powodu błędów zaokrągleń. Jeśli jednak zamiast średniej arytmetycznej przyjmiemy kolor korzenia poddrzewa równy kolorowi jednego z wierzchołków jego poddrzew (np. pierwszego), to możemy go później nie przesyłać i błędów zaokrągleń (ani żadnych obliczeń numerycznych) tu nie ma. Jest za to pewne pogorszenie jakości przybliżenia obrazu przez początkowo przesłane dane, przez co decyzja o przesłaniu go do końca lub nie, może być błędna.

Identyczna zasada tworzenia obrazów o niższej rozdzielczości ma zastosowanie w tzw. MIP-mappingu, który jest zastosowaniem elizji w nakładaniu tekstury. Będzie o tym mowa później.

W dokumencie Grafika komputerowa I – MIM UW (Stron 98-101)