Grafika Komputerowa. Algorytmy rastrowe
Aleksander Denisiuk
Polsko-Japo ´nska Akademia Technik Komputerowych Wydział Informatyki w Gda ´nsku
ul. Brzegi 55 80-045 Gda ´nsk
Algorytmy rastrowe
Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
Najnowsza wersja tego dokumentu dost ˛epna jest pod adresem
Rasteryzacja odcinka
Rasteryzacja odcinka
Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru A B C D
Zało˙zenia
Rasteryzacja odcinka
Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
(x, y)
— współrz˛edne „abstrakcyjne”, liczby rzeczywiste(i, j)
— współrz˛edne ekranowe, liczby całkowite
x
2> x
1, y
2>
y
1y
2− y
16
x
2− x
1Zaokr ˛aglenie:
i
1= round(x
1)
,i
2= round(x
2)
,j
1= round(y
1)
,Algorytm
Rasteryzacja odcinka
Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
y(i) = j
1+
i−i1 i2−i1(j
2− j
1)
j = round(y)
Kod:Wej ´scie:
(i
1, j
1)
— pocz ˛atek odcinka,(i
2, j
2)
— koniec odcinka,i
2> i
1, j
2>
j
1,j
2− j
16
i
2− i
1 Wynik: Odcinek został wy´swietlonym ←
j2−j1 i2−i1 writePixel(i
1,j
1)y ← j
1 fori = i
1+ 1
toi
2 doy ← y + m
j ← round(y)
writePixel(i
,j
) end forKumulacja przyrostu
y
Rasteryzacja odcinka
Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
na ka˙zdym kroku do przyrostu
y
dodaje si ˛em
Algorytm 2
Rasteryzacja odcinka
Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
Wej ´scie:
(i
1, j
1)
— pocz ˛atek odcinka,(i
2, j
2)
— koniec odcinka,i
2> i
1, j
2>
j
1,j
2− j
16
i
2− i
1Wynik: Odcinek został wy´swietlony
m ←
j2−j1 i2−i1b ← 0
writePixel(i
1,j
1)j ← j
1 fori = i
1+ 1
toi
2 dob ← b + m
ifb >
12 thenj ← j + 1
b ← b − 1
end if writePixel(i
,j
) end forEliminacja liczb rzeczywistych
Rasteryzacja odcinka
Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
przyrost jest wielokrotno´sci ˛a
m =
j2−j1i2−i1 :
b = k
j2−j1i2−i1
b <
12
⇐⇒ 2k(j
2− j
1) < i
2− i
1zamieniamy przyrost na przyrost całkowity
przyrost całkowity na ka˙zdym kroku zwi ˛eksza si ˛e
o
2∆j = 2(j
2− j
1)
przechodzimy na wy˙zszy poziom w
j
, je˙zeli przyrost całkowityAlgorytm Bresenhama
Rasteryzacja odcinka
Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
Wej ´scie:
(i
1, j
1)
— pocz ˛atek odcinka,(i
2, j
2)
— koniec odcinka,i
2> i
1, j
2>
j
1,j
2− j
16
i
2− i
1Wynik: Odcinek został wy´swietlony
m ← 2(j
2− j
1)
b ← 0
writePixel(i
1,j
1)j ← j
1P ← i
2− i
1 fori = i
1+ 1
toi
2 dob ← b + m
ifb > P
thenj ← j + 1
b ← b − 2P
end if writePixel(i
,j
) end forOsiem symetrii okr ˛egu
Rasteryzacja odcinka
Rasteryzacja okr ˛egu
Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
x
2+ y
2= R
2je˙zeli
(x, y)
le˙zy na okr ˛egu, to
(y, x)
,(x, −y)
,(y, −x)
,(−x, y)
,(−y, x)
,(−x, −y)
,Wybór nast ˛epnego piksela
Rasteryzacja odcinka
Rasteryzacja okr ˛egu
Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru Zaczynamy od wierzchołka
(0, R)
Analizujemyf (x, y) = 4 (x + 1)
2+ (y −
1 2)
2− R
2je˙zeli
f (x, y) > 0
to przechodzimy w prawo i w dółje˙zeli
f (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
Algorytm
Rasteryzacja odcinka
Rasteryzacja okr ˛egu
Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
Wej ´scie: ´Srodek okr ˛egu jest w
(0, 0)
, promie ´nR ∈ N
Wynik: Okr ˛ag został wy´swietlony
i ← 0
,j ← R
,f ← 5 − 4R
writePixel(i
,j
) whilei 6 j
do iff > 0
thenf ← f + 8i − 8j + 20
j ← j − 1
elsef ← f + 8i + 12
end ifi ← i + 1
writePixel(i
,j
) end whileRasteryzacja elipsy
Rasteryzacja odcinka Rasteryzacja okr ˛egu
Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
x
2a
2+
y
2b
2= 1
Zaczynamy od wierzchołka(0, b)
Analizujemyf (x, y) = 4a
2b
2 (x+1)2 a2+
(y−12)2 b2− 1
je˙zeli
f (x, y) > 0
to przechodzimy w prawo i w dółje˙zeli
f (x, y) < 0
to przechodzimy tylko w prawo
f (x + 1, y) = f (x, y) + 8b
2x + 12b
2
f (x + 1, y − 1) = f (x, y) + 8b
2x − 8a
2y + 12b
2+ 8a
2f (0, b) = 4b
2− 4a
2b + a
2Zmiana kierunku
Rasteryzacja odcinka Rasteryzacja okr ˛egu
Rasteryzacja elipsy
Rasteryzacja krywej Wypełnienie obszaru
Je˙zeli
b
2x > a
2y
, to zmienia si ˛e kierunek ratserizacjiAnalizujemy
g(x, y) = 4a
2b
2 (x+1 2)2 a2+
(y−1)2 b2− 1
je˙zeli
g(x, y) > 0
to przechodzimy w prawo i w dółje˙zeli
g(x, y) < 0
to przechodzimy tylko w dół
g(x, y) = f (x, y) − 4b
2x − 3b
2− 4a
2y + 3a
2g(x, y − 1) = g(x, y) − 8a
2y + 12a
2Algorytm
Rasteryzacja odcinka Rasteryzacja okr ˛egu
Rasteryzacja elipsy
Rasteryzacja krywej Wypełnienie obszaru
Wej ´scie: ´Srodek elipsy jest w
(0, 0)
, promieniea, b ∈ N
Wynik: Elipsa została wy´swietlona
i ← 0
,j ← b
,f ← 4b
2− 4a
2b + a
2 writePixel(i
,j
) whileb
2i 6 a
2j
do iff > 0
thenf ← f + 8b
2i − 8a
2j + 12b
2+ 8a
2j ← j − 1
elsef ← f + 8b
2i + 12b
2 end ifi ← i + 1
writePixel(i
,j
) end whileAlgorytm. Zmiana kierunku
Rasteryzacja odcinka Rasteryzacja okr ˛egu
Rasteryzacja elipsy Rasteryzacja krywej Wypełnienie obszaru
g ← f − 4b
2i − 3b
2− 4a
2j + 3a
2 whilej > 0
do ifg 6 0
theng ← g + 8b
2i − 8a
2j + 8b
2+ 12a
2i ← i + 1
elseg ← g − 8a
2j + 12a
2 end ifj ← j − 1
writePixel(i
,j
) end whileRasteryzacja krywej
Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy
Rasteryzacja krywej
Wypełnienie obszaru
Przybli˙zenie przez łaman ˛a
Metoda Eulera dla równania
˙x = f
1(x, y),
˙y = f
2(x, y),
x(0) = x
0,
y(0) = y
0.
Wypełnienie wieloboku
Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej
Przegl ˛
adanie liniami poziomymi (Scanline interpolation)
Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej
Wypełnienie obszaru
Wej ´scie: lista kraw ˛edzi wieloboku
{
(x
i, y
i), (x
i+1, y
i+1) }
,i = 0, . . . , n
,x
n= x
0,y
n= y
0Wynik: wypełniono wn ˛etrze wieloboku
uporz ˛adkuj wierzchołki w kraw ˛edziach aby
y
i< y
i+1, usu ´n kraw ˛edzie poziomeuporz ˛adkuj kraw ˛edzie w kolejno´sci rosn ˛acych
y
iTAK ← ∅
(Tabela Aktywnych Kraw ˛ezi)y ← y
i pierwszej kraw ˛edzirepeat
TAK ← TAK ∪ {
kraw ˛edzie, których pierwszy koniec jest na liniiy}
Opracowanie poziomu
y
y
++;TAK ← TAK \ {
kraw ˛edzie, których drugi koniec jest na liniiy}
Opracowanie poziomu
y
Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej
Wypełnienie obszaru
Wej ´scie:
TAK 6= ∅
(zawiera parzyst ˛a ilo´s´c elementów)Wynik: wypełniony poziom
y
for all kraw ˛edzi zTKA
doOblicz współrz˛edn ˛a
x
punktu przeci ˛ecia z lini ˛a poziom ˛ay
end for
Posortuj
TKA
w kolejno´sci rosn ˛acych współrz˛ednychx
punktówprzeci ˛ecia
for all kolejnych par kraw ˛edzi z
TKA
dorysuj odcinek poziomy na linii
y
, mi ˛edzy ich punktami przeci ˛eciaz lini ˛a
y
;Wypełnianie przez zalewanie
Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej
Wypełnienie obszaru
obszar jest czterospójny
Procedura rekurencyjna
Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej
Wypełnienie obszaru
Wej ´scie: punkt
(i, j)
zawiera si ˛e w obszarzeWynik: zamalowany cały obszar
if niezamalowany wewn ˛etrzny piksel
(i, j)
thenZamaluj
(i, j)
Wypełnij poczynaj ˛ac z
(i − 1, j)
Wypełnij poczynaj ˛ac z
(i, j − 1)
Wypełnij poczynaj ˛ac z
(i + 1, j)
Wypełnij poczynaj ˛ac z
(i, j + 1)
Stos zawieszonych zada ´n
Rasteryzacja odcinka Rasteryzacja okr ˛egu Rasteryzacja elipsy Rasteryzacja krywej
Wypełnienie obszaru
Wej ´scie: punkt
(i, j)
zawiera si ˛e w obszarzeWynik: zamalowany cały obszar
Stos
S ← ∅
zamaluj
(i, j)
;S ← S ∪ (i, j)
while
S 6= ∅
doS ← S \ (i, j)
if niezamalowany wewn ˛etrzny piksel
(i − 1, j)
thenzamaluj
(i − 1, j)
;S ← S ∪ (i − 1, j)
end if
if niezamalowany wewn ˛etrzny piksel
(i, j − 1)
thenzamaluj
(i, j − 1)
;S ← S ∪ (i, j − 1)
end if
if niezamalowany wewn ˛etrzny piksel
(i + 1, j)
thenzamaluj
(i − 1, j)
; StosS ← S ∪ (i + 1, j)
end if
if niezamalowany wewn ˛etrzny piksel
(i, j + 1)
thenzamaluj