algoritmi za rasterizaciju.pdf

27
ALGORITMI ZA RASTERIZACIJU Odabrana poglavlja kompjuterskih nauka Maja Mihojević 5113/M

Upload: maja-mihojevic

Post on 13-Feb-2016

22 views

Category:

Documents


6 download

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

HVALA NA PAŽNJI