Wprowadzenie do grafiki maszynowej. Wprowadzenie do algorytmów obcinania i okienkowania Aleksander Denisiuk Uniwersytet Warmińsko-Mazurski Olsztyn, ul. Słoneczna 54 denisjuk@matman.uwm.edu.pl 1 / 22
Wprowadzenie do algorytmów obcinania i okienkowania odcinków Najnowsza wersja tego dokumentu dostępna jest pod adresem http://wmii.uwm.edu.pl/~denisjuk/uwm 2 / 22
odcinków odcinków odcinków 3 / 22
odcinków odcinków odcinków wyznaczenie fragmentu odcinka lub prostej, który leży wewnatrz okna na ekranie wyznaczenie fragmentu odcinka lub prostej, który leży wewnatrz ustalonej bryły wielościennej 4 / 22
Przecięcie odcinka i prostej odcinków odcinków p 1 = (x 1,y 1 ), p 2 = (x 2,y 2 ) ax+by = c t = c ax 1 by 1 a(x 2 x 1 )+b(y 2 y 1 ) jeśli t / [0,1], to prosta i odcinek sa rozłaczne jeśli t [0,1], to można znaleźć punkt wspólny x = c y = c 5 / 22
Przecięcie odcinka i płaszczyzny odcinków odcinków p 1 = (x 1,y 1,z 1 ), p 2 = (x 2,y 2,z 2 ) ax+by +cz = d 6 / 22
Algorytm odcinków odcinków Dane sa punkty końcowe odcinka i prostokatne okno. Proste, na których leża krawędzie okna, dziela płaszczyznę na 9 obszarów. Przyporzadkujemy im czterobitowe kody: 7 / 22
Algorytm odcinków odcinków Wyznaczamy kody obszarów, do których należa końce odcinka jeśli oba kody na dowolnej pozycji maja jedynkę, to cały odcinek leży poza oknem 8 / 22
Algorytm odcinków odcinków Jeśli oba punkty końcowe maja kod 0, to cały odcinek leży wewnatrz okna Jeśli kody sa różne od 0, ale nie maja jedynki jednocześnie na żadnej pozycji, to odcinek może mieć części wewnatrz okna 9 / 22
Właściwie algorytm odcinków odcinków Wejście: odcinek [p 1,p 2 ] Wynik: część odcinka wewnatrz okna c 1 kod(p 1 ), c 2 kod(p 2 ) while c 1 or c 2 do if c 1 and c 2 then return end if if c 1 then Zamień (p 1,c 1 ) else Zamień (p 2,c 2 ) end if end while 10 / 22
Procedura Zamień odcinków odcinków Wejście: c = kod(p), c 0, c&c = 0 Wynik: p leży na tym samym odcinku, c = kod(p), c ma mniej niezerowych bitów if pierwszy bit jest niezerowy then p zamieniamy na przecięcie z y = top c kod(p) else if drugi bit jest niezerowy then p zamieniamy na przecięcie z y = bottom c kod(p) else if trzeci bit jest niezerowy then p zamieniamy na przecięcie z x = right c kod(p) else if czwarty bit jest niezerowy then p zamieniamy na przecięcie z x = left c kod(p) end if 11 / 22
Przykłady odcinków odcinków B 1001 1000 1010 C F D A H 0001 0000 0010 E G 0101 0100 0110 12 / 22
Algorytm odcinków odcinków { x = x 1 +s(x 2 x 1 ) = x 1 +s x, y = y 1 +s(y 2 y 1 ) = y 1 +s y, dla s [0,1], odcinek leży oknie jeżeli l x 1 +s x r oraz b y 1 +s y t czyli sp k q k, k = 1,2,3,4, gdzie p 1 = x, q 1 = x 1 l p 2 = x, q 2 = r x 1 p 3 = y, q 3 = y 1 b p 4 = y, q 4 = t y 1 13 / 22
Dla każdej krawędzi odcinków odcinków jeżeli p k = 0, to odcinek jest równoległy do tej krawędzi jeżeli q k < 0, to odcinek trzeba odrzucić jeżeli p k < 0, to odcinek wchodzi do okna { } obliczamy u k = max 0, q k p k jeżeli p k > 0, to odcinek wychodzi z okna } obliczamy v k = min{ qk p k,1 14 / 22
Wniosek odcinków odcinków u = maxu k, v = minv k przedział odcinka s [u,v] leży w oknie jeżeli u > v, odcinek jest poza oknem 15 / 22
Przykład odcinków odcinków 16 / 22
prostych odcinków odcinków Modyfikacja algorytmu : parametr s należy do całej prostej R, a nie do przedziału [0,1] 17 / 22
odcinków Sutherlanda- Hodgmana Przykład Wielokat niewypukły Weilera-Athertona 18 / 22
Algorytm Sutherlanda-Hodgmana odcinków Sutherlanda- Hodgmana Przykład Wielokat niewypukły Weilera-Athertona Obcinajacy wielokat (okno) jest wypukłym (przecięciem półpłaszczyzn) Obcinamy kolejno każda krawędzia (półpłaszczyzna): modyfikujemy ci ag wierzchołków stosownie do wzajemnego położenia 19 / 22
Przykład odcinków Sutherlanda- Hodgmana Przykład Wielokat niewypukły Weilera-Athertona 20 / 22
Wielokat niewypukły odcinków Sutherlanda- Hodgmana Przykład Wielokat niewypukły Weilera-Athertona wynik może być niespójny mamy krotna krawędź można wyeleminować 21 / 22
Algorytm Weilera-Athertona odcinków Sutherlanda- Hodgmana Przykład Wielokat niewypukły Weilera-Athertona 22 / 22