GKIW Moduł 7: Różnice pomiędzy wersjami
Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Nie podano opisu zmian |
Nie podano opisu zmian |
||
Linia 26: | Linia 26: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd4.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd4.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Zasady spójności | |||
''' | |||
Sutherland, Sproull i Schumacker zwrócili uwagę na pewną cechę analizy występującą w algorytmach określania widoczności. Jest nią spójność – pewne podobieństwo cech pozwalające wnioskować o zasłanianiu lub widoczności. | |||
Jeśli na przykład rozpatrzymy scenę zawierającą wielościany, to o widoczności wierzchołków możemy np. wnioskować na podstawie widoczności ściany.: Jeśli ściana jest widoczna to również jej węzły są widoczne, Tego typu wnioski powinny być ostrożnie formułowane, gdyż nie wszystkie sytuacje są oczywiste (np. wniosek, że odcinek łączący widoczne węzły jest widoczny, nie zawsze jest prawdziwy. | |||
|} | |} | ||
---- | ---- | ||
Linia 38: | Linia 43: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd6.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd6.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Algorytm malarski I | |||
Algorytm malarski (algorytm sortowania ścian)''' należy do grupy algorytmów z listą priorytetów. Algorytmy te wykorzystują informacje zarówno z przestrzeni obiektu jak i z przestrzeni rzutu (łączą operacje z precyzją obiektową i operacje z precyzją obrazową). Algorytm malarski zaproponowany przez Newella, Newella i Sancha w 1972 roku. Jest jednym z najprostszych opisowo i jednocześnie efektywnym. Polega on na posortowaniu elementarnych fragmentów sceny (wielokątów) zależnie od odległości od obserwatora: od najdalszego do najbliższego. Fragmenty są następnie rysowane w tej kolejności. Zakłada się przy tym, że rysunek powstaje analogicznie do malowania obrazu olejnego (stąd nazwa algorytmu). Tzn. fragment później namalowany zasłania (zamalowuje) wszystko, co było dotychczas namalowane w tym miejscu. Oczywiście tę cechę ma każde urządzenie wyświetlające (monitor, wyświetlacz LCD), ale stosowanie tego algorytmu bezpośrednio na drukarce byłoby niemożliwe. | |||
|} | |} | ||
---- | ---- | ||
Linia 44: | Linia 53: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd7.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd7.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Algorytm malarski II''' | |||
Posortowanie wielokątów jest zadaniem trudnym i może prowadzić do niejednoznaczności. Jeżeli rozpatrzymy dwa wielokąty dowolnie ustawione w przestrzeni, to podstawowym problemem jest ustalenie który z nich jest dalej od obserwatora. To znaczy,. który z nich będzie zasłonięty przez drugi wielokąt z punktu widzenia obserwatora. Żeby to określić stosuje się różne kryteria porównywania położenia. Najprostsze rozwiązanie polega na porównaniu współrzędnych z wielokątów. Jeżeli maksymalna współrzędna z jednego wielokąta jest mniejsza niż minimalna współrzędna z drugiego to pierwszy jest bliżej obserwatora. Oczywiście taki przypadek zachodzi rzadko, najczęściej zakresy współrzędnych wielokątów zazębiają się nie dając możliwości prawidłowego posortowania ich na podstawie takiego kryterium. Lepszym kryterium jest porównanie położenia środków ciężkości wielokątów – bliżej obserwatora znajduje się ten, którego środek ciężkości znajduje się bliżej. Niestety i to kryterium w pewnych sytuacjach zawodzi (czytelnik zechce przeanalizować położenia wielokątów kiedy sortowanie na podstawie położenia środków ciężkości dawałoby niepoprawne rysunki). O wiele lepszym kryterium (chociaż bardziej skomplikowanym obliczeniowo) jest analiza położenia jednego wielokąta względem płaszczyzny wyznaczonej przez drugi wielokąt .Jeżeli pierwszy z nich jest po tej samej stronie płaszczyzny co obserwator, to jest rzeczywiście bliżej obserwatora i nie może być zasłonięty przez drugi wielokąt. | |||
|} | |} | ||
---- | ---- | ||
Linia 50: | Linia 63: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd8.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd8.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Algorytm malarski III''' | |||
Jednak nawet kryterium wykorzystujące analizę położenia względem płaszczyzny nie radzi sobie w szczególnych przypadkach. Należą do nich: zasłanianie cykliczne i przecinanie się wielokątów. Pierwszy z nich stanowi tak naprawdę problem w wielu algorytmach rozstrzygania widoczności. Co prawda w praktyce występuje niezmiernie rzadko, ale dobrze skonstruowany algorytm powinien również w takim przypadku pracować poprawnie. (Przykładem występowania zasłaniania cyklicznego może być przysłona obiektywu fotograficznego, której kolejne elementy zachodzą na siebie.) Oba problemy mogą zostać rozwiązanie przez przecięcie jednego z wielokątów na dwie części i potraktowanie każdej z tych części jako niezależnego wielokąta w przeprowadzanej analizie położenia. | |||
|} | |} | ||
---- | ---- | ||
Linia 56: | Linia 73: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd9.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd9.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Algorytm skaningowy I''' | |||
Algorytm skaningowy (przeglądania liniami poziomymi) jest przykładem algorytmu pracującego w przestrzeni rzutu (działającego z precyzją obrazową). Zasada pracy tego algorytmu oparta jest na założeniu, że w każdym kroku postępowania przeglądana jest jedna linia pozioma obrazu. Można wskazać dwa źródła takiego postępowania. Z jednej strony można bezpośrednio powiązać algorytm z urządzeniem wyświetlającym funkcjonującym na podobnej zasadzie. Przykładem może być monitor, na którym obraz jest powstaje przez generację kolejnych poziomych linii. Z drugiej strony jest to związane z algorytmem wypełniania wielokąta poziomymi liniami. Modyfikując taki algorytm wypełniania można zapewnić dodatkowo eliminację elementów zasłoniętych. | |||
Kolejne linie poziome obrazu można rozpatrywać jako przecięcie ekranu i pewnej płaszczyzny prostopadłej do ekranu. Taka płaszczyzna przetnie wszystkie obiekty sceny. Każda linia obrazu może być rozpatrywana niezależnie. Problem rozstrzygania widoczności można zatem uprościć do niezależnej analizy każdej linii, przechodząc z analizy położenia wielokątów w przestrzeni trójwymiarowej do analizy położenia odcinków na płaszczyźnie. | |||
|} | |} | ||
---- | ---- | ||
Linia 62: | Linia 84: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd10.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd10.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Algorytm skaningowy II''' | |||
Najczęściej zakłada się, że wielokąty sceny, które podlegają analizie nie przecinają się – chociaż możliwa jest analiza algorytmem skaningowym również i takich przypadków. Dla danej linii analizuje się tablicę krawędzi (przynależności do wielokąta). Tablica ta określa dla danego piksela do rzutu jakich wielokątów ten piksel należy. Najprościej taką tablicę uzyskać traktując linię przeglądania jako prosta przecinana przez krawędzie kolejnych rzutów wielokątów. Podobnie jak w algorytmie wypełniania istnieje problem krawędzi poziomych. Często zakłada się, że bez zmniejszania ogólności można przyjąć, że taki przypadek nie będzie zachodził. Prościej jednak przeanalizować ten przypadek podobnie jak w wypełnianiu wielokąta liniami poziomymi. Mianowicie przyjąć że odcinek poziomy nie tworzy przecięć z linią przeglądająca ale w całości należy do przecinanego wielokąta (rzutu). Natomiast końce odcinka definiują początek i koniec tej przynależności. | |||
Analiza widoczności polega na analizie kolejnych odcinków między punktami przecięć w tablicy krawędzi. Punkty takiego pojedynczego odcinka należą do pewnego zbioru rzutów wielokątów. | |||
Jeśli ten zbiór jest pusty, to odcinek ten (tzn. odpowiadające mu piksele urządzenia wyświetlającego) należy wypełnić barwą tła. | |||
Jeśli zbiór jest jednoelementowy, to znaczy, że piksele tego odcinka należą dokładnie do jednego rzutu wielokąta. A to oznacza że nie zachodzi żadne zasłanianie i piksele odpowiadające temu odcinkowi należy wypełnić barwą rzutu danego wielokąta. | |||
Jeśli zbiór rzutów jest dwu lub więcej elementowy, to do wypełniania należy użyć barwy tego wielokąta, który jest najbliżej obserwatora. Oczywiście w tym przypadku wybór elementu najbliższego jest bardzo prosty, gdyż rozpatrujemy przecięcia wielokątów i płaszczyzny tnącej, czyli zbiór odcinków na płaszczyźnie. | |||
|} | |} | ||
---- | ---- | ||
Linia 68: | Linia 98: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd11.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd11.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Algorytm skaningowy III''' | |||
Algorytm skaningowy był wielokrotnie usprawniany poprzez dodanie mechanizmów przyspieszających jego działanie. Najciekawszą modyfikacją jest uproszczona analiza sąsiednich linii. Można zauważyć, że najczęściej dla sąsiednich linii schemat przynależności kolejnych pikseli do odpowiednich rzutów nie zmienia się. Oznacza to, że można raz zrobić pełną analizę widoczności, a następnie korzystać z niej przy kolejnych liniach przeglądających, dopóki schemat przynależności w tablicy krawędzi się nie zmieni. | |||
Złożoność algorytmu jest taka jak sortowania i wynika z pierwszej fazy algorytmu. Modyfikacje usprawniające (takie jak na przykład uproszczona analiza sąsiednich linii) nie wpływają na złożoność asymptotyczną, ale mogą w określonych sytuacjach przyspieszyć działanie algorytmu. | |||
Algorytm skaningowy rozwiązuje również problem zasłaniania cyklicznego. Ponieważ w pojedynczym kroku analizujemy jedną linię obrazową czyli jedno przecięcie płaszczyzną tnącą, to zasłanianie cykliczne nie stanowi problemu, gdyż na tej płaszczyźnie nie może zachodzić zasłanianie cykliczne odcinków. | |||
|} | |} | ||
---- | ---- | ||
Linia 74: | Linia 110: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd12.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd12.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Algorytm podziału binarnego I''' | |||
Pomysł wykorzystania zorientowania ścian pochodzący z 1969 roku został zastosowany w latach 1980-1983 do budowy algorytmu rozstrzygania widoczności zwanego algorytmem drzewa binarnego podziału przestrzeni (ang. BSP tree). | |||
Rozpatrzmy przypadek jak na rysunku. Każdej płaszczyźnie można przypisać zorientowanie (zaznaczone strzałkami, zwrot zgodny ze strzałkami w drzewie został zaznaczony + , zwrot przeciwny został oznaczony - ). Kolejność analizy (budowy drzewa podziału) – to znaczy wybór kolejnych płaszczyzn jest dowolny. Może to oczywiście wpłynąć na kształt drzewa, wpływa także na konieczność podziału ścian wielościanu. Na przykład ściana c na rysunku została podzielona na fragmenty c1, c2 i c3 co wynika z wcześniejszego podziału przestrzeni. Algorytm podziału binarnego w takiej postaci może zostać także wykorzystany do sprawdzenia czy dany punkt należy do wnętrza wielościanu. | |||
|} | |} | ||
---- | ---- | ||
Linia 80: | Linia 121: | ||
|width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd13.png|thumb|500px]] | |width="500px" valign="top"|[[Grafika:GKIW_M7_Slajd13.png|thumb|500px]] | ||
|valign="top"| | |valign="top"| | ||
'''Algorytm podziału binarnego II''' | |||
Drzewo jest przeglądane w kolejności INORDER z uwzględnieniem zorientowania. | |||
procedure przeglądaj_BSP (drzewo) | |||
begin | |||
if drzewo jest niepuste then | |||
if obserwator „z przodu” (+) korzenia drzewa then | |||
begin | |||
przeglądaj_BSP (tylne (-) poddrzewo); | |||
narysuj obiekt z korzenia drzewa; | |||
przeglądaj_BSP (przednie (+) poddrzewo); | |||
end; | |||
else // tu obserwator z tyłu (-) korzenia drzewa | |||
begin | |||
przeglądaj_BSP (przednie (+) poddrzewo); | |||
narysuj obiekt z korzenia drzewa; | |||
przeglądaj_BSP (tylne (-) poddrzewo); | |||
end; | |||
end; | |||
|} | |} | ||
---- | ---- |
Wersja z 10:01, 27 paź 2006
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Bryła wypukła I Zadanie określenia widoczności elementów wielościanu wypukłego można więc rozwiązać na dwa sposoby korzystając z rozwiązań A i B sprawdzających zorientowanie poszczególnych ścian. |