algoritmi za rasterizaciju.pdf
TRANSCRIPT
ALGORITMI ZA
RASTERIZACIJU Odabrana poglavlja kompjuterskih nauka
Maja Mihojević
5113M
UVOD Rasterizacija - postupak u kome se podaci vezani za objekat u vektorskom sistemu
pretvaraju u oblik pogodan za prikaz na ekranu proces prevođenja grafčkih primitiva iz
kontinualnog u diskretni oblik
Rasterska mreža
NAIVNI ALGORITAM
OSNOVNI ALGORITAM
Parametarski oblik jednačine
kroz dvije tačke M1(x1 y1) i
M2(x2 y2)
x = x1+k(x2-x1)
y = y1+k(y2-y1)
pri čemu je 0le k le1
Mijenjamo koeficijenat k sa
nekim malim korakom i
uvrštavamo u prethodne dvjie
jednačine
Nema najbolje performanse
NAGIBNI ALGORITAM
y = mx + b
m-koeficijent smjera m= dy
dx =
y2minusy
1
x2minusx
1
Izračuna se y = mx + b za x = x1
x = x1+1 x = x2
INKREMENTALNI ALGORITAM (DDA)
yi+1 = mxi+1 + b =
= m( xi + Δx) + b =
= mxi + b +Δxm =
= yi + Δxm
Za Δx = 1 je yi+1 = yi + m
Za |m|gt1 zamjene se uloge od x
i y
yi+1 = yi + 1
xi+1 = xi + 1 119896
Osvijetlit ćemo piksel sa
koordinatama (xiRound(yi))
xi i=012hellip cjelobrojne
koordinate
119910119894= m xi + b
Round(yi) = 05 + 119910119894
Ostaju operacije sa realnim
brojevima
BRESENHAMOV ALGORITAM
Inkrementalni algoritam koji
koristi isključivo cjelobrojnu
aritmetiku
M polovina rastrojanja između
dva piksela
Q presjek originalne linije i linije
x = xp + 1
U Bresenhamovoj formulaciji
računamo rastojanje između
gornjeg i donjeg i tačke Q
U formulaciji srednje tačke
posmatramo s koje strane linije
leži tačka M
Linija u implicitnom obliku F(xy)= ax+by+c =0
Ako stavimo dy=y1-y0 dx=x1-x0 onda jednačinu u eksplicitnom obliku
možemo pisati y=dy
dx x+ l
A implicitna jednačina postaje F(xy)= dyx - dxy + ldx gdje su a = dy
b = - dx c = ldx
Ako je F(xy) = 0 =gt tačka je na pravi
Ako je F(xy) lt 0 =gt tačka je ispod prave
Ako je F(xy) gt 0 =gt tačka je iznad prave
Računamo F(M) = F(xp+1 yp +12)
Uzimamo d = F(xp+1 yp +12) = a (xp+1) + b (yp +12) + c
dgt0 biramo piksel GD
dlt0 biramo piksel D
d=0 biramo bilo koji piksel
Ako je izabran piksel D onda se M pomiče jedan korak u smjeru x
Ako je izabran piksel GD tada se M pomiče jedan korak u smjeru x i jedan
u smjeru y
Prva krajnja tačka je (x0 y0) pa je prva srednja točka (x0 + 1 y0 +12)
Za inicijalnu vrijednost od d uzimamo F(x0 + 1 y0 +12) == F(x0 y0) + a
+b2
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
UVOD Rasterizacija - postupak u kome se podaci vezani za objekat u vektorskom sistemu
pretvaraju u oblik pogodan za prikaz na ekranu proces prevođenja grafčkih primitiva iz
kontinualnog u diskretni oblik
Rasterska mreža
NAIVNI ALGORITAM
OSNOVNI ALGORITAM
Parametarski oblik jednačine
kroz dvije tačke M1(x1 y1) i
M2(x2 y2)
x = x1+k(x2-x1)
y = y1+k(y2-y1)
pri čemu je 0le k le1
Mijenjamo koeficijenat k sa
nekim malim korakom i
uvrštavamo u prethodne dvjie
jednačine
Nema najbolje performanse
NAGIBNI ALGORITAM
y = mx + b
m-koeficijent smjera m= dy
dx =
y2minusy
1
x2minusx
1
Izračuna se y = mx + b za x = x1
x = x1+1 x = x2
INKREMENTALNI ALGORITAM (DDA)
yi+1 = mxi+1 + b =
= m( xi + Δx) + b =
= mxi + b +Δxm =
= yi + Δxm
Za Δx = 1 je yi+1 = yi + m
Za |m|gt1 zamjene se uloge od x
i y
yi+1 = yi + 1
xi+1 = xi + 1 119896
Osvijetlit ćemo piksel sa
koordinatama (xiRound(yi))
xi i=012hellip cjelobrojne
koordinate
119910119894= m xi + b
Round(yi) = 05 + 119910119894
Ostaju operacije sa realnim
brojevima
BRESENHAMOV ALGORITAM
Inkrementalni algoritam koji
koristi isključivo cjelobrojnu
aritmetiku
M polovina rastrojanja između
dva piksela
Q presjek originalne linije i linije
x = xp + 1
U Bresenhamovoj formulaciji
računamo rastojanje između
gornjeg i donjeg i tačke Q
U formulaciji srednje tačke
posmatramo s koje strane linije
leži tačka M
Linija u implicitnom obliku F(xy)= ax+by+c =0
Ako stavimo dy=y1-y0 dx=x1-x0 onda jednačinu u eksplicitnom obliku
možemo pisati y=dy
dx x+ l
A implicitna jednačina postaje F(xy)= dyx - dxy + ldx gdje su a = dy
b = - dx c = ldx
Ako je F(xy) = 0 =gt tačka je na pravi
Ako je F(xy) lt 0 =gt tačka je ispod prave
Ako je F(xy) gt 0 =gt tačka je iznad prave
Računamo F(M) = F(xp+1 yp +12)
Uzimamo d = F(xp+1 yp +12) = a (xp+1) + b (yp +12) + c
dgt0 biramo piksel GD
dlt0 biramo piksel D
d=0 biramo bilo koji piksel
Ako je izabran piksel D onda se M pomiče jedan korak u smjeru x
Ako je izabran piksel GD tada se M pomiče jedan korak u smjeru x i jedan
u smjeru y
Prva krajnja tačka je (x0 y0) pa je prva srednja točka (x0 + 1 y0 +12)
Za inicijalnu vrijednost od d uzimamo F(x0 + 1 y0 +12) == F(x0 y0) + a
+b2
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
NAIVNI ALGORITAM
OSNOVNI ALGORITAM
Parametarski oblik jednačine
kroz dvije tačke M1(x1 y1) i
M2(x2 y2)
x = x1+k(x2-x1)
y = y1+k(y2-y1)
pri čemu je 0le k le1
Mijenjamo koeficijenat k sa
nekim malim korakom i
uvrštavamo u prethodne dvjie
jednačine
Nema najbolje performanse
NAGIBNI ALGORITAM
y = mx + b
m-koeficijent smjera m= dy
dx =
y2minusy
1
x2minusx
1
Izračuna se y = mx + b za x = x1
x = x1+1 x = x2
INKREMENTALNI ALGORITAM (DDA)
yi+1 = mxi+1 + b =
= m( xi + Δx) + b =
= mxi + b +Δxm =
= yi + Δxm
Za Δx = 1 je yi+1 = yi + m
Za |m|gt1 zamjene se uloge od x
i y
yi+1 = yi + 1
xi+1 = xi + 1 119896
Osvijetlit ćemo piksel sa
koordinatama (xiRound(yi))
xi i=012hellip cjelobrojne
koordinate
119910119894= m xi + b
Round(yi) = 05 + 119910119894
Ostaju operacije sa realnim
brojevima
BRESENHAMOV ALGORITAM
Inkrementalni algoritam koji
koristi isključivo cjelobrojnu
aritmetiku
M polovina rastrojanja između
dva piksela
Q presjek originalne linije i linije
x = xp + 1
U Bresenhamovoj formulaciji
računamo rastojanje između
gornjeg i donjeg i tačke Q
U formulaciji srednje tačke
posmatramo s koje strane linije
leži tačka M
Linija u implicitnom obliku F(xy)= ax+by+c =0
Ako stavimo dy=y1-y0 dx=x1-x0 onda jednačinu u eksplicitnom obliku
možemo pisati y=dy
dx x+ l
A implicitna jednačina postaje F(xy)= dyx - dxy + ldx gdje su a = dy
b = - dx c = ldx
Ako je F(xy) = 0 =gt tačka je na pravi
Ako je F(xy) lt 0 =gt tačka je ispod prave
Ako je F(xy) gt 0 =gt tačka je iznad prave
Računamo F(M) = F(xp+1 yp +12)
Uzimamo d = F(xp+1 yp +12) = a (xp+1) + b (yp +12) + c
dgt0 biramo piksel GD
dlt0 biramo piksel D
d=0 biramo bilo koji piksel
Ako je izabran piksel D onda se M pomiče jedan korak u smjeru x
Ako je izabran piksel GD tada se M pomiče jedan korak u smjeru x i jedan
u smjeru y
Prva krajnja tačka je (x0 y0) pa je prva srednja točka (x0 + 1 y0 +12)
Za inicijalnu vrijednost od d uzimamo F(x0 + 1 y0 +12) == F(x0 y0) + a
+b2
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
OSNOVNI ALGORITAM
Parametarski oblik jednačine
kroz dvije tačke M1(x1 y1) i
M2(x2 y2)
x = x1+k(x2-x1)
y = y1+k(y2-y1)
pri čemu je 0le k le1
Mijenjamo koeficijenat k sa
nekim malim korakom i
uvrštavamo u prethodne dvjie
jednačine
Nema najbolje performanse
NAGIBNI ALGORITAM
y = mx + b
m-koeficijent smjera m= dy
dx =
y2minusy
1
x2minusx
1
Izračuna se y = mx + b za x = x1
x = x1+1 x = x2
INKREMENTALNI ALGORITAM (DDA)
yi+1 = mxi+1 + b =
= m( xi + Δx) + b =
= mxi + b +Δxm =
= yi + Δxm
Za Δx = 1 je yi+1 = yi + m
Za |m|gt1 zamjene se uloge od x
i y
yi+1 = yi + 1
xi+1 = xi + 1 119896
Osvijetlit ćemo piksel sa
koordinatama (xiRound(yi))
xi i=012hellip cjelobrojne
koordinate
119910119894= m xi + b
Round(yi) = 05 + 119910119894
Ostaju operacije sa realnim
brojevima
BRESENHAMOV ALGORITAM
Inkrementalni algoritam koji
koristi isključivo cjelobrojnu
aritmetiku
M polovina rastrojanja između
dva piksela
Q presjek originalne linije i linije
x = xp + 1
U Bresenhamovoj formulaciji
računamo rastojanje između
gornjeg i donjeg i tačke Q
U formulaciji srednje tačke
posmatramo s koje strane linije
leži tačka M
Linija u implicitnom obliku F(xy)= ax+by+c =0
Ako stavimo dy=y1-y0 dx=x1-x0 onda jednačinu u eksplicitnom obliku
možemo pisati y=dy
dx x+ l
A implicitna jednačina postaje F(xy)= dyx - dxy + ldx gdje su a = dy
b = - dx c = ldx
Ako je F(xy) = 0 =gt tačka je na pravi
Ako je F(xy) lt 0 =gt tačka je ispod prave
Ako je F(xy) gt 0 =gt tačka je iznad prave
Računamo F(M) = F(xp+1 yp +12)
Uzimamo d = F(xp+1 yp +12) = a (xp+1) + b (yp +12) + c
dgt0 biramo piksel GD
dlt0 biramo piksel D
d=0 biramo bilo koji piksel
Ako je izabran piksel D onda se M pomiče jedan korak u smjeru x
Ako je izabran piksel GD tada se M pomiče jedan korak u smjeru x i jedan
u smjeru y
Prva krajnja tačka je (x0 y0) pa je prva srednja točka (x0 + 1 y0 +12)
Za inicijalnu vrijednost od d uzimamo F(x0 + 1 y0 +12) == F(x0 y0) + a
+b2
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
NAGIBNI ALGORITAM
y = mx + b
m-koeficijent smjera m= dy
dx =
y2minusy
1
x2minusx
1
Izračuna se y = mx + b za x = x1
x = x1+1 x = x2
INKREMENTALNI ALGORITAM (DDA)
yi+1 = mxi+1 + b =
= m( xi + Δx) + b =
= mxi + b +Δxm =
= yi + Δxm
Za Δx = 1 je yi+1 = yi + m
Za |m|gt1 zamjene se uloge od x
i y
yi+1 = yi + 1
xi+1 = xi + 1 119896
Osvijetlit ćemo piksel sa
koordinatama (xiRound(yi))
xi i=012hellip cjelobrojne
koordinate
119910119894= m xi + b
Round(yi) = 05 + 119910119894
Ostaju operacije sa realnim
brojevima
BRESENHAMOV ALGORITAM
Inkrementalni algoritam koji
koristi isključivo cjelobrojnu
aritmetiku
M polovina rastrojanja između
dva piksela
Q presjek originalne linije i linije
x = xp + 1
U Bresenhamovoj formulaciji
računamo rastojanje između
gornjeg i donjeg i tačke Q
U formulaciji srednje tačke
posmatramo s koje strane linije
leži tačka M
Linija u implicitnom obliku F(xy)= ax+by+c =0
Ako stavimo dy=y1-y0 dx=x1-x0 onda jednačinu u eksplicitnom obliku
možemo pisati y=dy
dx x+ l
A implicitna jednačina postaje F(xy)= dyx - dxy + ldx gdje su a = dy
b = - dx c = ldx
Ako je F(xy) = 0 =gt tačka je na pravi
Ako je F(xy) lt 0 =gt tačka je ispod prave
Ako je F(xy) gt 0 =gt tačka je iznad prave
Računamo F(M) = F(xp+1 yp +12)
Uzimamo d = F(xp+1 yp +12) = a (xp+1) + b (yp +12) + c
dgt0 biramo piksel GD
dlt0 biramo piksel D
d=0 biramo bilo koji piksel
Ako je izabran piksel D onda se M pomiče jedan korak u smjeru x
Ako je izabran piksel GD tada se M pomiče jedan korak u smjeru x i jedan
u smjeru y
Prva krajnja tačka je (x0 y0) pa je prva srednja točka (x0 + 1 y0 +12)
Za inicijalnu vrijednost od d uzimamo F(x0 + 1 y0 +12) == F(x0 y0) + a
+b2
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
INKREMENTALNI ALGORITAM (DDA)
yi+1 = mxi+1 + b =
= m( xi + Δx) + b =
= mxi + b +Δxm =
= yi + Δxm
Za Δx = 1 je yi+1 = yi + m
Za |m|gt1 zamjene se uloge od x
i y
yi+1 = yi + 1
xi+1 = xi + 1 119896
Osvijetlit ćemo piksel sa
koordinatama (xiRound(yi))
xi i=012hellip cjelobrojne
koordinate
119910119894= m xi + b
Round(yi) = 05 + 119910119894
Ostaju operacije sa realnim
brojevima
BRESENHAMOV ALGORITAM
Inkrementalni algoritam koji
koristi isključivo cjelobrojnu
aritmetiku
M polovina rastrojanja između
dva piksela
Q presjek originalne linije i linije
x = xp + 1
U Bresenhamovoj formulaciji
računamo rastojanje između
gornjeg i donjeg i tačke Q
U formulaciji srednje tačke
posmatramo s koje strane linije
leži tačka M
Linija u implicitnom obliku F(xy)= ax+by+c =0
Ako stavimo dy=y1-y0 dx=x1-x0 onda jednačinu u eksplicitnom obliku
možemo pisati y=dy
dx x+ l
A implicitna jednačina postaje F(xy)= dyx - dxy + ldx gdje su a = dy
b = - dx c = ldx
Ako je F(xy) = 0 =gt tačka je na pravi
Ako je F(xy) lt 0 =gt tačka je ispod prave
Ako je F(xy) gt 0 =gt tačka je iznad prave
Računamo F(M) = F(xp+1 yp +12)
Uzimamo d = F(xp+1 yp +12) = a (xp+1) + b (yp +12) + c
dgt0 biramo piksel GD
dlt0 biramo piksel D
d=0 biramo bilo koji piksel
Ako je izabran piksel D onda se M pomiče jedan korak u smjeru x
Ako je izabran piksel GD tada se M pomiče jedan korak u smjeru x i jedan
u smjeru y
Prva krajnja tačka je (x0 y0) pa je prva srednja točka (x0 + 1 y0 +12)
Za inicijalnu vrijednost od d uzimamo F(x0 + 1 y0 +12) == F(x0 y0) + a
+b2
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
BRESENHAMOV ALGORITAM
Inkrementalni algoritam koji
koristi isključivo cjelobrojnu
aritmetiku
M polovina rastrojanja između
dva piksela
Q presjek originalne linije i linije
x = xp + 1
U Bresenhamovoj formulaciji
računamo rastojanje između
gornjeg i donjeg i tačke Q
U formulaciji srednje tačke
posmatramo s koje strane linije
leži tačka M
Linija u implicitnom obliku F(xy)= ax+by+c =0
Ako stavimo dy=y1-y0 dx=x1-x0 onda jednačinu u eksplicitnom obliku
možemo pisati y=dy
dx x+ l
A implicitna jednačina postaje F(xy)= dyx - dxy + ldx gdje su a = dy
b = - dx c = ldx
Ako je F(xy) = 0 =gt tačka je na pravi
Ako je F(xy) lt 0 =gt tačka je ispod prave
Ako je F(xy) gt 0 =gt tačka je iznad prave
Računamo F(M) = F(xp+1 yp +12)
Uzimamo d = F(xp+1 yp +12) = a (xp+1) + b (yp +12) + c
dgt0 biramo piksel GD
dlt0 biramo piksel D
d=0 biramo bilo koji piksel
Ako je izabran piksel D onda se M pomiče jedan korak u smjeru x
Ako je izabran piksel GD tada se M pomiče jedan korak u smjeru x i jedan
u smjeru y
Prva krajnja tačka je (x0 y0) pa je prva srednja točka (x0 + 1 y0 +12)
Za inicijalnu vrijednost od d uzimamo F(x0 + 1 y0 +12) == F(x0 y0) + a
+b2
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
Linija u implicitnom obliku F(xy)= ax+by+c =0
Ako stavimo dy=y1-y0 dx=x1-x0 onda jednačinu u eksplicitnom obliku
možemo pisati y=dy
dx x+ l
A implicitna jednačina postaje F(xy)= dyx - dxy + ldx gdje su a = dy
b = - dx c = ldx
Ako je F(xy) = 0 =gt tačka je na pravi
Ako je F(xy) lt 0 =gt tačka je ispod prave
Ako je F(xy) gt 0 =gt tačka je iznad prave
Računamo F(M) = F(xp+1 yp +12)
Uzimamo d = F(xp+1 yp +12) = a (xp+1) + b (yp +12) + c
dgt0 biramo piksel GD
dlt0 biramo piksel D
d=0 biramo bilo koji piksel
Ako je izabran piksel D onda se M pomiče jedan korak u smjeru x
Ako je izabran piksel GD tada se M pomiče jedan korak u smjeru x i jedan
u smjeru y
Prva krajnja tačka je (x0 y0) pa je prva srednja točka (x0 + 1 y0 +12)
Za inicijalnu vrijednost od d uzimamo F(x0 + 1 y0 +12) == F(x0 y0) + a
+b2
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
dpočetni= a + b2 =dy ndashdx2
Da izbjegnemo dijeljenje redifinisat ćemo funkciju F(xy) = 2(ax + by +c)
Ova verzija algoritma vrijedi samo za one linije čiji je koeficijent smjera m
takav da vrijedi 0 le m lt 1
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
ALGORITAM void SredtocLinija(int x0 int y0 int x1 int y0 int v) Pretpostavlja se 0 le k lt 1 x0 lt
x1
int dx = x1- x0
int dy = y1- y0
int d = 2 dy-dx Inicijalna vrijednost od d
int deltaD = 2 dy Korak za pomicanje do D
int deltaGD = 2(dy- dx) Korak za pomicanje do GD
int x = x0
int y = y0
NacrtajPixel(xyv) Početni pixel
while(x lt x1)
if(d lt= 0) Izaberi D
d+ = deltaD
x + +
else Izaberi GD
d+ = deltaGD
x + +
y + +
NacrtajPixel(xyv) Izabrani piksel najbliži liniji
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
PRIMJER
Želimo aproksimirati liniju
zadanu krajnjim tačkama (58)
(911)
dx = 4 dy = 3deltaD = 6
deltaGD = -2
x =5 y = 8 d = 2 pa biramo GD
x = 6 y = 9 d = 0 biramo D
x = 7 y = 9 d = 6 biramo GD
x =8 y = 10 d = 4 biramo GD
x =8 y = 10 kraj
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
RASTERIZACIJA KRUŽNICE Implicitna jednačina kružnice sa središtem u ishodištu data je sa
x2 + y2 = R2
eksplicitne jednadžbe kružnice
y = plusmn 1198772 minus 1199092
Možemo crtati po četvrtinu kružnice za 0 le x le R i y gt0 i onda koristiti
simetriju
Neefikasno
Možemo također koristiti parametarski oblik (R cos ϴ R sin ϴ) za 0 le ϴ
le π2
Neefikasno radi trigonometrijskih funkcija
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
Osmerostruka simetrija
void TackeKruznice(int xint yint v)
NacrtajPixel(xyv)
NacrtajPixel(yxv)
NacrtajPixel(y-xv)
NacrtajPixel(x-yv)
NacrtajPixel(-x-yv)
NacrtajPixel(-y-xv)
NacrtajPixel(-yxv)
NacrtajPixel(-xyv)
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
BRESENHAMOV ALGORITAM SREDNJE TOČKE ZA KRUŽNICE
Podrazumjevamo da je centar u
ishodištu
Drugi oktant za 0 le x lt R 2 i
R 2 lt y le R
Koristimo proceduru TackeKruznice
Biramo tačku koja je bliža srednjoj
tački
Definišimo funkciju F(xy) = x2 + y2 -
R2 Za nju vrijedi
F(xy) = 0 tačka na kružnici
F(xy) gt 0 izvan kružnice
F(xy) lt 0 unutar kružnice
Ako je tačka M izvan kružnice tada je
piksel JI bliži kružnici
Ako je M unutar kružnice tada je
piksel I bliži kružnici
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
definišimo test varijablu d kao staru vrijednost funkcije F(xy) u srednjoj
tački
dstari = F (xp + 1 yp ndash 12) = (xp + 1)2 + (yp ndash 12)2 ndashR2
Ako je dstari lt 0 M se pomiče jedan korak u smjeru x
Ako je dstari ge 0 M se pomiče jedan korak u smjeru x i jedan korak u
smjeru ndashy
Prvi piksel je na kružnici (0R) a sljedeća tačka leži u (1 R ndash frac12) i zato je
F(1 R ndash frac12) = 1 + (R2 ndash R + frac14) ndash R2 = 54 ndash R
Da izbjegnemo realnu aritmetiku uvedimo novu test varijablu h = d ndash frac14
Tada inicijalizacija glasi h = 1 ndash R a test umjesto d lt 0 glasi h lt frac14
Kako h ima na početku cjelobrojnu vrijednost i inkremntira se cjelobrojnim
vrijednostima ΔI i ΔJI test možemo promijeniti u h lt 0
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
Efikasniji algoritam ukoliko i ΔI i ΔJI računamo inkrementalno
Ako u tekućem koraku izaberemo I odabrana tačka se pomiče sa (xpyp) na
(xp + 1yp) i izvod prvog reda u (xpyp) je ΔIstari = 2xp + 3 A u (xp + 1yp)
ΔInovi = 2(xp + 1) +3 Izvod drugog reda je ΔInovi - ΔIstari = 2
Izvod prvog reda u (xpyp) je ΔIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp) ΔInovi
= 2(xp + 1) ndash 2yp + 5 a izvod druog reda je ΔInovi - ΔIstari = 2
Ako u tekućem koraku izaberemo JI onda se odabrana tačka pomiče sa
(xpyp) na (xp + 1yp-1) Izvod prvog reda u (xpyp) je ΔJIstari = 2xp + 3 a u
(xp + 1yp-1) ΔJInovi = 2(xp + 1) +3 Izvod drugog reda je ΔJInovi ndash ΔJIstari =
2
Izvod prvog reda u (xpyp) je ΔJIstari = 2xp ndash 2yp + 5 pa je u (xp + 1yp-1)
ΔJInovi = 2(xp + 1) ndash 2(yp -1)+ 5 a izvod druog reda je ΔJInovi ndash ΔJIstari = 4
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
void SredtocKruznica(int r int v) Pretpostavlja se da je središte kružnice u
ishodištu
int x = 0 int y = r
int d = 1 - r
int deltaI = 3 int deltaJI = -2 r + 5
TockeKruznice(xyv)
while (y gt x)
if (d lt 0) Izaberi I
d+ = deltaI
deltaI+ = 2
deltaJI+ = 2
else Izaberi JI
d+ = deltaJI
deltaI+ = 2
deltaJI+ = 4
y 1048576 1048576
x + +
TockeKruznice(xyv)
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
OBREZIVANJE (CLIPPING) Korisnik može interaktivno mijenjati položaj i veličinu prozora u kojemu
se prikazuje grafika
Analitičko - najprije se izračunaju osnovni parametri obrezane primitive
(kao npr krajnje tačke linije) a nakon toga se primjenjuju algoritmi za
rasterizaciju s novim parametrima
efikasno za realni koordinatni sustav
Istovremeno sa rasterizacijom - svaki piksel primitive se podvrgava
testu da li se nalazi unutar pravougaonika za obrezivanje ili ne
praktično za popunjene i debele primitive jer se provjeravaju samo rubni
pikseli i kada je prikaz primitive malo veći od pravougaonika za
obrezivanje
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
OBREZIVANJE LINIJA Analitički
Imamo više slučajeva
1 linija leži unutar pravougaonika -prikazuje se u potpunosti
2 linija siječe bar jedan rub pravougaonika-prikazuje se obrezana
linija
3 linija leži na samoj granici prikazuje se
4 linija leži izvan pravougaonika ne prikazuje se
Tačka (xy) leži unutar pravougaonika ako vrijedi
xmin le x le xmax i ymin le y leymax
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
COHEN-SUTHERLANDOV ALGORITAM U ovome algoritmu se vrši provjera krajnjih tačaka Imamo 3 slučaja
1 trivijalno prihvaćanje
2 trivijalno odbijanje
3 niti jedan uvjet nije zadovoljen
Segment se iterativno obrezuje i provjerava da li sada pripada prvom ili
drugom slučaju
Provjeru vršimo na sljedeći način
posmatramo prave koje su definisane rubovima obrezivanje one
dijele ravan na 9 područja
svakom području dodijelimo 4-bitni kod
kod je određen položajem područja u odnosu na vanjske poluravni
definisane rubovima pravougaonika
svaki bit je postavljen na 1 (istina) ili 0 (laž)
1 bit vanjska poluravan gornjeg ruba iznad gornjeg ruba (y gt ymax)
2 bit vanjska poluravan donjeg ruba ispod donjeg ruba (y lt ymin)
3 bit vanjska poluravan desnog ruba desno od desnog ruba (x gt xmax)
4 bit vanjska poluravan lijevog ruba lijevo od lijevog ruba (x lt xmin)
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
EFEKAT NAZUBLJIVANJA
Prikaz slike na računaru zahtjeva diskretizaciju
Javlja se neželjeni efekat alias koji se ogleda u nazubljenim linijama
Koristeći različite nivoe osvijetljenja oko ivičnih linija nekog oblika koji
se predstavlja u oku se stvara iluzija glatkih linija
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
Prefiltering
Piksel se tretira kao 2D objekat
Možemo iskoristiti udaljenost d u Bresenhamovom algoritmu
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
Postfiltering (supersampling)
Slika se renderuje na n puta većoj rezoluciji nego što će biti prikazana
Boja konačnog piksela se računa kao prosjek boja pod-piksela od kojih
se on sastoji
Težinski koeficijenti
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI
Izračunamo kodove od obadvije krajnje točke
Provjerimo uvjete za trivijalno prihvaćanje i odbijanje
Ako obje provjere nisu zadovoljene tada tražimo točku koja leži izvan
pravokutnika
Provjeravamo kod vanjske točke kako bi odredili rub kojeg linija siječe
Nalazimo sjecište linije i tog ruba
Odrežimo segment od vanjske točke do sjecišta time što ćemo vanjsku
krajnju točku zamijeniti sjecištem
Izračunamo kod nove krajnje točke kako bismo se pripremili za sljedeću
iteraciju
HVALA NA PAŽNJI