Upload
nguyennhan
View
231
Download
1
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