38
Raˇ cunarska grafika Algoritmi za crtanje 2D primitiva Vesna Marinkovi´ c Vesna Marinkovi´ c Raˇ cunarska grafika Algoritmi za crtanje 2D primitiva 1 / 38

Ra cunarska gra ka Algoritmi za crtanje 2D primitivapoincare.matf.bg.ac.rs/~vesnap/grafika/02_rasterizacija.pdf · Midpoint algoritam (varijanta Bresenhamovog algoritma) Bresenham

Embed Size (px)

Citation preview

Racunarska grafikaAlgoritmi za crtanje 2D primitiva

Vesna Marinkovic

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 1 / 38

Obnavljanje

Osnovni koncepti sa prethodnog casa

Racunarska grafika se bavi pravljenjem modela objekata na sceni imodela osvetljenja scene i na osnovu toga pravljenjem određenogpogleda na scenu

Dve osnovne poddiscipline racunarske grafike:

Modelovanje – izrada matematicke specifikacije objekata i njihovihvizuelnih svojstava, zadavanje modela svetlosti i pozicioniranje nasceni; hijerarhijski je zasnovanoRenderovanje – na osnovu modela objekata i modela ponasanjasvetlosti pravi se realisticna 2D slika; razlikujemo renderovanje unapredi renderovanje unazad

Grafika moze biti zasnovana na uzorku ili na geometriji

Grafika moze biti interaktivna i neinteraktivna

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 2 / 38

Algoritmi za crtanje 2D primitiva Rasterski i vektorski sistemi

Vektorski i rasterski sistemi

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 3 / 38

Algoritmi za crtanje 2D primitiva Rasterski i vektorski sistemi

Vektorska grafika (eps, svg, . . .)

Slika je predstavljena kao kolekcija geometrijskih figura(tacke, prave, krive, poligoni,. . .)

Za svaku figuru cuvaju se njeni parametri i njen polozaj na slici

Memorija koju slika zauzima zavisi od njenog sadrzaja, cesto je manjaod rasterske slike

Skaliranje vektorske slike je jednostavno i sa savrsenom preciznoscu

Vektorska grafika se koristi za fontove, logotipove, stampani materijalvelikog formata, animacije, . . .

Nije pogodna za predstavljanje fotografija ili fotorealisticnih slika;potreban je poseban softver za njihovu obradu

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 4 / 38

Algoritmi za crtanje 2D primitiva Rasterski i vektorski sistemi

Rasterska grafika (jpg, png, bmp, . . .)

Ekranu je pridruzena matrica piksela – bitmapa

Piksel – kvadrat određen celobrojnom mrezom (celobrojne tacke sucentri kvadrata) ili krug sa centrom u cvorovima celobrojne mreze

Koordinatni pocetak je u donjem levom uglu ekrana

Svaki piksel ima jednu od 2N vrednosti (N - broj bitova po pikselu)

Memorija koju slika zauzima zavisi od rezolucije i bitske dubine

Problemi pri skaliranju slike (nazubljenost, mutnost)

Koristi se za fotografije, u veb dizajnu, . . .

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 5 / 38

Algoritmi za crtanje 2D primitiva Rasterizacija

Rasterizacija

Rasterizacija (ili sken konverzija) je proces transformisanja objekataniskog nivoa u njihovu rastersku verziju (tj. reprezentaciju pikselima)

Podrazumeva se da su na raspolaganju operacije:

setpixel(x,y,color)

getpixel(x,y)

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 6 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Crtanje duzi – opis problema

Zadatak: Postaviti boje piksela tako da aproksimiraju duz od tacke(x0, y0) do tacke (x1, y1)

Zahtevi:

Sto blize idealnoj pravojObavezno prolazi kroz krajnje tackeSve tacke svake duzi su iste osvetljenosti bez obzira na nagib i duzinuCrtanje treba da bude sto brze

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 7 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Jednacine prave

Eksplicitna jednacina prave je y = mx + B

Iz pripadnosti tacaka (x0, y0) i (x1, y1) pravoj, dobijamo m = y1−y0x1−x0

Jednacina prave kroz jednu zadatu tacku: y = m(x − x0) + y0

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 8 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Koeficijent pravca prave

Vidljiva je razlika u osvetljenosti duzi razlicitog koeficijenta pravca

|m| < 1 – crta se po tacno jedan piksel u svakoj kolonim > 1 ili m < −1 – crta se po tacno jedan piksel u svakoj vrsti

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 9 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Crtanje duzi – osnovni zadatak

Jednobitna slika (piksel ima dve moguce vrednosti: 0 i 1)

Duz je debljine 1

Duz ima koeficijent pravca m: |m| < 1za |m| > 1 – simetricno

Kriterijum ocene kvaliteta: minimalno rastojanje od idealne duzi

Zbog pogodosti racuna piksel cemo u algoritmima razmatrati uterminima krugova sa centrom u cvorovima celobrojne mreze

mozemo koristiti termine “između dve tacke”, “prava je bliza jednomod dva susedna piksela” . . .

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 10 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Algoritam grube sile

procedure Line_brute_force(x0, y0, x1, y1 : integer);

var

x : integer;

dx, dy, y, m : real;

begin

dx := x1 - x0;

dy := y1 - y0;

m := dy/dx;

for x := x0 to x1 do

begin

y := m * (x - x0) + y0;

setpixel(x, round(y));

end

end.

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 11 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Algoritam grube sile – nedostaci

Veliki broj operacija – svaki korak ukljucuje sabiranje, oduzimanje,mnozenje, zaokruzivanje

Koriscenje aritmetike u pokretnom zarezu – mnozenje, sabiranje,zaokruzivanje

Pomocne promenljive su realnog tipa

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 12 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Osnovni inkrementalni algoritam – ideja

Vazi veza:

yi+1 = mxi+1 + B = m(xi + 1) + B = mxi + m + B = yi + m

Ideja inkrementalnosti – za racunanja u narednom koraku koristimovec izracunate vrednosti iz prethodnog korakaNa ovaj nacin eliminise se mnozenje

xi , [yi + 0.5]

xi+1, [yi + 0.5 + m]

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 13 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Osnovni inkrementalni algoritam

procedure Line_increment_basic(x0, y0, x1, y1 : integer);

var

x : integer;

dx, dy, y, m : real;

begin

dx := x1 - x0;

dy := y1 - y0;

m := dy/dx;

y := y0;

for x := x0 to x1 do

begin

setpixel(x, round(y));

y := y + m

end

end.

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 14 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Osnovni inkrementalni algoritam – komentari

Sta bi se desilo sa ovim algoritmom u slucaju |m| > 1?

Nedostaci ovog algoritma:

m je realna vrednost izracunata sa nekom tacnoscu i greska senagomilavaI dalje vrsimo zaokruzivanjePromenljive su i dalje realnog tipa

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 15 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Midpoint algoritam (varijanta Bresenhamovog algoritma)

Bresenham (1965) – crtanje duzi koriscenjem celobrojne aritmetike

Pitteway (1967), Van Aken (1984) – unapredili algoritam, moze seuopstiti na proizvoljnu krivu drugog reda

Zahtevi:

0 < m < 1(x0, y0) je donja leva tacka, a (x1, y1) gornja desna i potrebno ih jespojiti

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 16 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Midpoint algoritam (varijanta Bresenhamovog algoritma)

Oznacili smo piksel P(xp, yp) i u narednom koraku pravimo izborizmeđu samo dva piksela: E i NE

Bresenham: razmatra rastojanje tacaka E i NE do presecne tacke duzikoju rasterizujemo sa pravom x = xp + 1 i bira blizuMidpoint: razmatra odnos tacke M (srediste duzi određene sa E i NE )sa duzi koju rasterizujemo: ako je M ispod preseka duzi kojurasterizujemo sa pravom x = xp + 1 biramo NE , a inace E

P = (xp, yp)

prethodni tekuci piksel naredni

E

NE

M

Q

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 17 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Midpoint algoritam (nastavak)

Kako proveravamo da li se tacka M nalazi iznad ili ispod date pravekoriscenjem celobrojne aritmetike?

Iz eksplicitne jednacine prave dobijamo njenu implicitnu jednacinu:

y =dy

dxx + B (dx = x1 − x0, dy = y1 − y0)

F (x , y) = dy · x − dx · y + B · dx = 0

Vrednost F (x , y) jednaka je 0 za tacke na pravoj, pozitivna je zatacke ispod prave, a negativna za tacke iznad prave

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 18 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Midpoint algoritam – promenljiva odlucivanja

Vrednost d = F (xp + 1, yp + 12) na osnovu koje se pravi izbor zovemo

promenljiva odlucivanja:

d < 0 – biramo Ed > 0 – biramo NEd = 0 – stvar dogovora, biramo E

Koja je pozicija tacke M i vrednost promenljive d za narednu linijumreze? Odgovor zavisi od toga da li smo u prethodnom korakuodabrali piksel E ili NE

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 19 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Midpoint algoritam – azuriranje promenljive odlucivanja

Ako smo u prethodnom koraku odabrali E :

dnew = F (xp + 2, yp +1

2) = a(xp + 2) + b(yp +

1

2) + c =

a + a(xp + 1) + b(yp +1

2) + c = a + dold = dold + dy = dold + ∆E

Ako smo u prethodnom koraku odabrali NE :

dnew = F (xp + 2, yp +3

2) = a(xp + 2) + b(yp +

3

2) + c =

a+b+a(xp+1)+b(yp+1

2)+c = a+b+dold = dold+dy−dx = dold+∆NE

∆E , odnosno ∆NE je korektivni faktor i nazivamo ga razlikom unapred

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 20 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Midpoint algoritam – pocetna iteracija

Algoritam u svakom koraku bira između dva piksela na osnovu znakapromenljive odlucivanja

Naredna vrednost promenljive odlucivanja racuna se na osnovuprethodne – inkrementalni pristup

Potrebno nam je da eksplicitno izracunamo prvu vrednost

Za prvu tacku vazi:

dstart = F (x0 + 1, y0 +1

2) = a(x0 + 1) + b(y0 +

1

2) + c = a + b/2

Da bi se izbeglo deljenje sa dva, sve vrednosti mnozimo sa 2; pritomrelevantni znakovi ostaju isti

dstart = 2a + b = 2dy − dxako je dold ≤ 0, onda dnew = dold + 2dyako je dold > 0, onda je dnew = dold + 2dy − 2dx

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 21 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Midpoint algoritam za crtanje duzi

procedure Line_midpoint(x0, y0, x1, y1 : integer);

var

dx, dy, x, y, f : integer;

begin

dx := x1 - x0;

dy := y1 - y0;

y := y0;

f := 2*dy - dx;

for x := x0 to x1 do

begin

setpixel(x, y);

if (f <= 0)

begin

f := f + 2*dy;

end

else

begin

y := y+1;

f := f + 2*(dy-dx);

end

end

end.

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 22 / 38

Algoritmi za crtanje 2D primitiva Crtanje duzi

Crtanje duzi – dodatni zahtevi

Duzi razlicitog nagiba a iste duzine imaju razlicite osvetljenosti

Duzi P0P1 i P1P0 treba da se crtaju na isti nacin

zbog stilova nije dobro uvek svoditi na poredak sleva nadesnovazan je odabir piksela kada je vrednost promenljive odlucivanja d = 0

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 23 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Crtanje kruga – opis problema

Zadatak: Postaviti boje piksela tako da aproksimiraju sliku kruga sacentrom u (0, 0)

Zahtevi:

Sto blize idealnom kruguCrtanje treba da bude sto brze

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 24 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Crtanje kruga – osnovni zadatak

Jednobitna slika (piksel ima dve moguce vrednosti: 0 i 1)

Krug je debljine 1

Centar kruga je u tacki (0, 0)

Radimo sa jednim kvadrantom; na osnovu simetrije mogu se odreditipikseli u ostalim kvadrantima

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 25 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Algoritam grube sile

Implicitna jednacina kruga je: x2 + y2 = R2, a iz nje mozemo dobitieksplicitnu jednacinu: y = ±

√R2 − x2

xi se inkrementira za po 1 i osvetljavamo tacku:

(xi , [√R2 − x2i + 0.5]), i = 1, 2, 3, . . .

Nedostaci:neefikasno: aritmetika u pokretnom zarezu, racunanje korena,zaokruzivanje, . . .sa porastom vrednosti x povecavaju se praznine između tacaka

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 26 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Midpoint (Bresenham-ov) inkrementalni algoritam

Bresenham (1977), Midpoint algoritam je varijanta Bresnehamovogalgoritma

Razmatramo samo osminu kruga; ostali slucajevi obrađuju sesimetricno

Vrednost x ide od 0 do R/√

2

Osnovna ideja slicna je ideji za crtanje duzi: u svakom koraku trebaodabrati jednu od dve moguce tacke

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 27 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Midpoint (Bresenham-ov) inkrementalni algoritam

P = (xp, yp)

prethodni tekuci piksel naredni

E

SE

M

MSE

ME

Vrednost F (x , y) = x2 + y2 − R2 je jednaka 0 u tackama kojepripadaju krugu, pozitivna je u spoljasnjosti, a negativna uunutrasnjosti krugaAko je tacka M u unutrasnjosti kruga, onda je tacka E bliza krugunego tacka SE . Ako je tacka M u spoljasnjosti kruga, onda je tackaSE bliza krugu

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 28 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Midpoint algoritam – promenljiva odlucivanja

P = (xp, yp)

prethodni tekuci piksel naredni

E

SE

M

MSE

ME

Vrednost d = F (xp + 1, yp − 12) = (xp + 1)2 + (yp − 1

2)2 − R2 naosnovu koje se pravi izbor nazivamo promenljiva odlucivanja:

d < 0, bira se tacka Ed > 0, bira se tacka SEd = 0, stvar dogovora, bira se tacka SE

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 29 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Midpoint algoritam – azuriranje promenljive odlucivanja

Ako je dold < 0, tacka E je izabrana i vazi:

dnew = F (xp+2, yp−1

2) = (xp+2)2+(yp−

1

2)2−R2 = dold +(2xp+3)

Ako je dold ≥ 0, tacka SE je izabrana i vazi:

dnew = F (xp+2, yp−3

2) = (xp+2)2+(yp−

3

2)2−R2 = dold+(2xp−2yp+5)

U slucaju dold < 0 koristi se ∆E = 2xp + 3

U slucaju dold ≥ 0 koristi se ∆SE = 2xp − 2yp + 5

Obe ove razlike zavise od koordinata tacke P

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 30 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Midpoint algoritam za crtanje kruga – analiza

Pocetni uslov (za celobrojni poluprecnik):

F (0,R) = 0

F (1,R − 1

2) = 1 + (R2 − R +

1

4)− R2 =

5

4− R

Prva vrednost za d nije celobrojna

Koristicemo zamenu h = d − 14 : tada je inicijalna vrednost h = 1− R,

a poređenje d < 0 postaje h < −14

Kako je inicijalna vrednost promenljive d celobrojna i kako suvrednosti koje se dodaju (∆E i ∆SE ) celobrojne, ovaj uslov moze dase zameni sa h < 0

Ovako uvedenu promenljivu h na kraju oznacavamo sa d

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 31 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Midpoint algoritam za crtanje kruga

procedure MidpointCircle (radius : integer);

var

x, y, d : integer;

begin

x := 0;

y := radius;

d := 1-radius;

setpixel(x, y);

while (y > x) do

begin

if d < 0 then { select E }

begin

d := d + 2*x + 3;

x := x + 1;

end

else { select SE }

begin

d := d + 2*(x-y) + 5;

x := x + 1;

y := y - 1;

end

setpixel(x, y);

end

end.

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 32 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Unapređeni midpoint algoritam za crtanje kruga

Vrednosti ∆E i ∆SE su linearne te za njihovo izracunavanje takođemozemo koristiti tehniku inkrementalnog uvecavanja

Ideja je da se i za ove vrednosti, kao kod razlika unapred, novevrednosti ∆Enew i ∆SEnew izraziti preko starih ∆Eold i ∆SEold

Pritom u svakom koraku moramo azurirati i ∆E i ∆SE jer namazurirana verzija neke od ovih vrednosti moze zatrebati u nekojnarednoj iteraciji

Prilikom analize, vaznu ulogu igra informacija koja je tacka bilaizabrana u prethodnom koraku, da bismo znali gde se premestanaredna referentna tacka

Vrednosti za koje se uvecavaju promenljive ∆E i ∆SE nazivamorazlike drugog reda

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 33 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Unapređeni midpoint algoritam – azuriranje razlika drugogreda

Ako je izabrana tacka E , referentna tacka se pomera iz (xp, yp) u(xp + 1, yp)

Vrednost ∆Eold u (xp, yp) je jednaka 2xp + 3, a vrednost ∆Enew (utacki (xp + 1, yp)) je jednaka

∆Enew = 2(xp + 1) + 3 = ∆Eold + 2

Vrednost ∆SEold u (xp, yp) jednaka je 2xp − 2yp + 5 te je vrednost∆SEnew (u tacki (xp + 1, yp)) jednaka

∆SEnew = 2(xp + 1)− 2yp + 5 = ∆SEold + 2

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 34 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Unapređeni midpoint algoritam – azuriranje razlika drugogreda

Ako je izabrana tacka SE , referentna tacka se pomera iz (xp, yp) u(xp + 1, yp − 1)

Vrednost ∆Eold u (xp, yp) je jednaka 2xp + 3, a vrednost ∆Enew (utacki (xp + 1, yp − 1)) je jednaka

∆Enew = 2(xp + 1) + 3 = ∆Eold + 2

Vrednost ∆SEold u (xp, yp) jednaka je 2xp − 2yp + 5, a vrednost ∆SEnew

(u tacki (xp + 1, yp − 1)) je jednaka

∆SEnew = 2(xp + 1)− 2(yp − 1) + 5 = ∆SEold + 4

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 35 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Unapređeni midpoint algoritam za crtanje kruga

procedure MidpointCircle2 (radius : integer);

var

x, y, d, deltaE, deltaSE : integer;

begin

x := 0;

y := radius;

d := 1 - radius;

deltaE := 3;

deltaSE := -2*radius + 5;

setpixel(x, y);

while (y>x) do

begin

if d < 0 then { select E }

begin

d := d + deltaE;

deltaE := deltaE + 2;

deltaSE := deltaSE + 2;

x := x + 1;

end

else { select SE }

begin

d := d + deltaSE;

deltaE := deltaE + 2;

deltaSE := deltaSE + 4;

x := x + 1;

y := y - 1;

end

setpixel(x, y);

end

end.Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 36 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Crtanje kruga ciji centar nije u koordinatnom pocetku

Ako srediste kruga nije tacka (0, 0) nego (a, b), koristi se algoritamslican navedenom

Nije isplativo za svaki piksel pojedinacno dodavati a i b (u odnosu napiksele kruga sa sredistem (0, 0)

Sve razlike prvog i drugog reda su iste (ako je poluprecnik isti) bezobzira na srediste kruga

Razlikuje se samo pocetni piksel – umesto (0,R), prvi ukljuceni pikseltreba da bude (a,R + b), a umesto uslova y > x treba koristiti uslovy-b > x-a ili efikasnije y > x+(b-a)

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 37 / 38

Algoritmi za crtanje 2D primitiva Crtanje kruga

Naredne nedelje...

Popunjavanje poligona

Seckanje duzi

Vesna Marinkovic Racunarska grafika Algoritmi za crtanje 2D primitiva 38 / 38