Grafika Komputerowa. Algorytmy rastrowe Aleksander Denisiuk Polsko-Japońska Akademia Technik Komputerowych Wydział Informatyki w Gdańsku ul. Brzegi 55 80-045 Gdańsk Ò Ù Ô º ÙºÔÐ 1 / 23
Algorytmy rastrowe Najnowsza wersja tego dokumentu dostępna jest pod adresem ØØÔ»»Ù Ö ºÔ º ÙºÔл Ò Ù 2 / 23
3 / 23
Założenia (x,y) współrzędne abstrakcyjne, liczby rzeczywiste (i,j) współrzędne ekranowe, liczby całkowite x 2 > x 1,y 2 y 1 y 2 y 1 x 2 x 1 Zaokr aglenie:i 1 = round(x 1 ),i 2 = round(x 2 ),j 1 = round(y 1 ), j 2 = round(y 2 ) 4 / 23
Algorytm y(i) = j 1 + i i 1 i 2 i 1 (j 2 j 1 ) j = round(y) Kod: Wejście: (i 1,j 1 ) poczatek odcinka,(i 2,j 2 ) koniec odcinka, i 2 > i 1,j 2 j 1,j 2 j 1 i 2 i 1 Wynik: Odcinek został wyświetlony m j 2 j 1 i 2 i 1 writepixel(i 1,j 1 ) y j 1 fori = i 1 +1toi 2 do y y +m j round(y) writepixel(i,j) end for 5 / 23
Kumulacja przyrostuy na każdym kroku do przyrostuy dodaje sięm przechodzimy o jeden piksel w górę, jejeżi przyrost przekroczy1/2 6 / 23
Algorytm 2 Wejście: (i 1,j 1 ) poczatek odcinka,(i 2,j 2 ) koniec odcinka, i 2 > i 1,j 2 j 1,j 2 j 1 i 2 i 1 Wynik: Odcinek został wyświetlony m j 2 j 1 i 2 i 1 b 0 writepixel(i 1,j 1 ) j j 1 fori = i 1 +1toi 2 do b b+m ifb > 1 2 then j j +1 b b 1 end if writepixel(i,j) end for 7 / 23
Eliminacja liczb rzeczywistych przyrost jest wielokrotnościam = j 2 j 1 i 2 i : 1 b = k j 2 j 1 i 2 i 1 b < 1 2 2k(j 2 j 1 ) < i 2 i 1 zamieniamy przyrost na przyrost całkowity przyrost całkowity na każdym kroku zwiększa się o2 j = 2(j 2 j 1 ) przechodzimy na wyższy poziom wj, jeżeli przyrost całkowity przekroczy(i 2 i 1 ) 8 / 23
Algorytm Bresenhama Wejście: (i 1,j 1 ) poczatek odcinka,(i 2,j 2 ) koniec odcinka, i 2 > i 1,j 2 j 1,j 2 j 1 i 2 i 1 Wynik: Odcinek został wyświetlony m 2(j 2 j 1 ) b 0 writepixel(i 1,j 1 ) j j 1 P i 2 i 1 fori = i 1 +1toi 2 do b b+m ifb > P then j j +1 b b 2P end if writepixel(i,j) end for 9 / 23
Osiem symetrii okręgu x 2 +y 2 = R 2 jeżeli(x,y) leży na okręgu, to (y,x),(x, y),(y, x),( x,y),( y,x),( x, y), ( y, x) też leża na okręgu 10 / 23
Wybór następnego piksela Zaczynamy od wierzchołka(0,r) Analizujemyf(x,y) = 4 ( (x+1) 2 +(y 1 2 )2 R 2) jeżelif(x,y) > 0 to przechodzimy w prawo i w dół jeżelif(x,y) < 0 to przechodzimy tylko w prawo f(x+1,y) = f(x,y)+8x+12 f(x+1,y 1) = f(x,y)+8x 8y +20 f(0,r) = 5 4R 11 / 23
Algorytm Wejście: Środek okręgu jest w(0,0), promieńr N Wynik: Okrag został wyświetlony i 0,j R,f 5 4R writepixel(i,j) whilei j do iff > 0 then f f +8i 8j +20 j j 1 else f f +8i+12 end if i i+1 writepixel(i,j) end while 12 / 23
x 2 a 2 + y2 b 2 = 1 Zaczynamy od wierzchołka(0,b) ( Analizujemyf(x,y) = 4a 2 b 2 (x+1) 2 + (y 1 a 2 2 )2 b 2 ) 1 jeżelif(x,y) > 0 to przechodzimy w prawo i w dół jeżelif(x,y) < 0 to przechodzimy tylko w prawo f(x+1,y) = f(x,y)+8b 2 x+12b 2 f(x+1,y 1) = f(x,y)+8b 2 x 8a 2 y +12b 2 +8a 2 f(0,b) = 4b 2 4a 2 b+a 2 13 / 23
Zmiana kierunku Jeżelib 2 x > a 2 y, to zmienia się ( kierunek ratserizacji Analizujemyg(x,y) = 4a 2 b 2 (x+ 1 ) 2 )2 + (y 1)2 1 a 2 b 2 jeżelig(x,y) > 0 to przechodzimy w prawo i w dół jeżelig(x,y) < 0 to przechodzimy tylko w dół g(x,y) = f(x,y) 4b 2 x 3b 2 4a 2 y +3a 2 g(x,y 1) = g(x,y) 8a 2 y +12a 2 g(x+1,y 1) = g(x,y)+8b 2 x 8a 2 y +8b 2 +12a 2 14 / 23
Algorytm Wejście: Środek elipsy jest w(0,0), promieniea,b N Wynik: Elipsa została wyświetlona i 0,j b,f 4b 2 4a 2 b+a 2 writepixel(i,j) whileb 2 i a 2 j do iff > 0 then f f +8b 2 i 8a 2 j +12b 2 +8a 2 j j 1 else f f +8b 2 i+12b 2 end if i i+1 writepixel(i,j) end while 15 / 23
Algorytm. Zmiana kierunku g f 4b 2 i 3b 2 4a 2 j +3a 2 whilej 0 do ifg 0 then g g +8b 2 i 8a 2 j +8b 2 +12a 2 i i+1 else g g 8a 2 j +12a 2 end if j j 1 writepixel(i,j) end while 16 / 23
Przybliżenie przez łamana Metoda Eulera dla równania ẋ = f 1 (x,y), ẏ = f 2 (x,y), x(0) = x 0, y(0) = y 0. 17 / 23
Wypełnienie wieloboku 18 / 23
Przegladanie liniami poziomymi (Scanline interpolation) Wejście: lista krawędzi wieloboku{ [ (x i,y i ),(x i+1,y i+1 ) ] }, i = 0,...,n,x n = x 0,y n = y 0 Wynik: wypełniono wnętrze wieloboku uporzadkuj wierzchołki w krawędziach abyy i < y i+1, usuń krawędzie poziome uporzadkuj krawędzie w kolejności rosn TAK (Tabela Aktywnych Krawęzi) y y i pierwszej krawędzi acychy i repeat TAK TAK {krawędzie, których pierwszy koniec jest na linii y} Opracowanie poziomuy y ++; TAK TAK \{krawędzie, których drugi koniec jest na liniiy} untiltak = 19 / 23
Opracowanie poziomuy Wejście: TAK (zawiera parzysta ilość elementów) Wynik: wypełniony poziomy for all krawędzi ztka do Oblicz współrzędnaxpunktu przecięcia z linia poziom end for PosortujTKA w kolejności rosnacych współrzędnychxpunktów przecięcia for all kolejnych par krawędzi ztka do rysuj odcinek poziomy na liniiy, między ich punktami przecięcia z liniay; end for ay 20 / 23
Wypełnianie przez zalewanie obszar jest czterospójny brzeg obszaru jest ośmiospójny 21 / 23
Procedura rekurencyjna Wejście: punkt(i,j) zawiera się w obszarze Wynik: zamalowany cały obszar if niezamalowany wewnętrzny piksel(i,j) then Zamaluj(i,j) Wypełnij poczynaj Wypełnij poczynaj Wypełnij poczynaj Wypełnij poczynaj end if ac z(i 1,j) ac z(i,j 1) ac z(i+1,j) ac z(i,j +1) 22 / 23
Stos zawieszonych zadań Wejście: punkt(i,j) zawiera się w obszarze Wynik: zamalowany cały obszar StosS zamaluj(i,j);s S (i,j) whiles do S S \(i,j) if niezamalowany wewnętrzny piksel(i 1,j) then zamaluj(i 1,j);S S (i 1,j) end if if niezamalowany wewnętrzny piksel(i,j 1) then zamaluj(i,j 1);S S (i,j 1) end if if niezamalowany wewnętrzny piksel(i+1,j) then zamaluj(i 1,j); StosS S (i+1,j) end if if niezamalowany wewnętrzny piksel(i,j +1) then zamaluj(i 1,j);S S (i,j +1) end if end while 23 / 23