970 likes | 1.19k Views
Algoritmi rasterske grafike. Risanje primitivov. V ektorski prikazovalniki “rišejo” na zaslon gladke krivulje ali ravne črte . Raster ski prikazovalniki delujejo na principu mreže in že po sami naravi ne morejo prikazovati povsem gladkih krivulj oziroma črt.
E N D
Risanje primitivov • Vektorski prikazovalniki “rišejo” na zaslon gladke krivulje ali ravne črte. • Rasterski prikazovalniki delujejo na principu mreže in že po sami naravi ne morejo prikazovati povsem gladkih krivulj oziroma črt. Masovno tržišče danes temelji na rastrskih prikazovalnikih.
Piksel NI majhen kvadrat (sx,sy) Poglej male kvadratke… (W,H) Koordinatni sistem slike, neodvisen od resolucije, je:
Piksel NI majhen kvadrat x y • Model z majhnimi kvadratki poskuša predstaviti piksel (element slike) kot geometrijski kvadrat. • na primer pixel (i,j) naj bi bil to: pri čemer smo omejeni na:
Piksel NI majhen kvadrat Ali leži središče piksla na celih številih? ... ali na polovičnih številih?
Piksel NI majhen kvadrat • Piksel je točka vzorčenja. Obstaja le v točki. • Barvni piksel ima pravzaprav 3 vzorce: rdečega, zelenega in modrega. • Piksel ni kvadratek. • Slika je pravokotno polje točkovnih vzorcev (diskretno, ne zvezno) • Zakaj je model“malega kvadratka” popularen: • Upodabljanje (pretvorba iz abstraktne geometrije v vidne piksle) • Če predpostavimo zveznost, je matematika bolj enostavna.
Piksel NI majhen kvadrat • Zakaj ne smemo istovetiti modela "majhnih kvadratkov" s posameznim pikslom? • Povečava • Povečava izgleda kot skupek majhnih kvadratkov, vendar se dejanski piksel ni povečal.
Uvod v 2D upodabljanje • 2D primitivni gradniki • Ravne črte • Elipse in krogi • Poligoni • Krivulje • Rasterizacija(Scan-Conversion) • 2D primitive pretvorimo v množico pikslov • Piksel ni majhen kvadratek(Digitalna obdelava signalov) • Mehčanje robov (antialiasing ) • Obrezovanje (clipping) • Račun presečišč primitivov z liki • Primitivi: segmenti črt, poligoni • Liki: pravokotniki, konveksni poligoni
Nekaj matematike • Koordinatni sistem: os navzdol ali navzgor? • Piksli so v središču celoštevilčnih koordinat • Segmenti črt • Enačba (2D) premice: ax + by + c = 0 • Smer: (-b a) • Vektor normale: (a b) • Parametrična enačba segmenta [P1-P2]: x(t) = x1 + t*(x2-x1) = (1-t)*x1 + t*x2y(t) = y1 + t*(y2-y1) = (1-t)*y1 + t*y2 t in [0..1]
Nekaj matematike • Poligoni • Sklenjeno zaporedje daljic (P1 P2 .. Pn) • Različni tipi • Konveksni - konkavni • Križajoči se (Self-intersecting ,8-shape) • Z luknjami
Rasterizacija • Pretvorba matematičnih definicij v piksle • Matematično definicijo lahko le aproksimiramo • Piksel ni mali kvadratek • Izogibanje luknjam • Vsak piksel narišemo natančno enkrat • Naiven (in drag) pristop • Ocenjevanje formul na mreži pikslov • Pameten pristop • Uporaba celoštevilčnih računanj • Izogibanje množenju in deljenju • Uporaba inkrementalne matematike • Uporaba prostorske koherence
Ravne črte y = m•x + c Črte potekajo med dvema točkama: (x1,y1) , (x2,y2) Primer: med (3,0) in (13, 10) 10 0 0 3 13
Enačba premice y m x 1 • Enačba premice je y - m.x + c = 0 • Za daljico med točkama P(x1,y1) in P(x2,y2) • Naklonmpomeni, da za vsak inkrement v smeri X za eno enoto povečamo Y za m enot
Naivni algoritem rasterizacije črt • Daljica je definirana s točkama P0 P1 • Enačba premice je: Y = mX + Bm = (y1-y0) / (x1-x0)B = y0 - m*x0 • Algoritem: • Začnemo z najmanjšim (x0,x1) • Izračunamo ustrezno vrednost y • SetPixel(x, round(y)) • Povečamo x za 1 in krožimo, dokler ne dosežemo max(x0,x1) • Cena: 1 float mult + 1 float add + 1 round v vsaki iteraciji
Inkrementalni algoritem rasterizacije črt • Računamo y s pomočjo predhodne vrednosti y, namesto od začetka y[i+1] = y[i] + m*(x[i+1]-x[i]) • Ker pa povečujemo x za 1:y[i+1] = y[i] + m • Cena: 1 float add + 1 round na iteracijo
Minimiziranje računanj s plavajočo vejico Pri ravnih črtah lahko število računanj s plavajočo vejico zmanjšamo še na naslednji način: if (x1 = = x2) => navpična črta elseif (y1 = = y2) => vodoravna črta else yk+1 = yk + m
Približno risanje črt • Predpostavimo piksle v obliki kvadratkov. • Predpostavimo, da črta začne pri (x1, y1) in konča pri (x2, y2). • Naj velja dx=x2-x1, dy=y2-y1 • Najbolj preprost primer je, ko velja dx=dy, • Tedaj imamo diagonalo pod kotom 450. Pri vsakem koraku x imamo tudi korak v smeri y.
Problemi z ravnimi črtami • V splošnem ravne črte niso navpične ali vodoravne. • Približek pikslov so kvadrati, ki podpirajo le navpične in vodoravne črte. • V splošnem primeru pa moramo uporabiti primeren kompromis. Pojav stopnice
Problemi z ravnimi črtami • Osnovna zahteva za približek je, da bo napaka v vsakem koraku najmanjša. • Največja dopustna napaka je polovica piksla. Kateri piksel naj pobarvamo?
Približno risanje črt Y X • V vsakem koraku x računamo razliko med dejansko pozicijo y in zahtevano pozicijo y. Če je razlika več kot za polovico piksla, naredimo korak še v smeri y.
Digitalni diferencialni analizator (DDA) • Algoritmu digitalnega diferencialnega analizatorja popularno pravimo DDA • To je inkrementalni algoritem, kar pomeni, da v vsakem koraku upošteva računanje iz prejšnjega koraka. • Algoritem uporablja operacije s plavajočo vejico, katerim pa se izognemo v Bresenhamovem algoritmu za risanje črt. • Manjša različica: Midpoint Line Drawing Algorithm
Digitalni diferencialni analizator (DDA) • Poglejmo vrstico v prvem oktantu. Ostale primere lahko iz tega z lahkoto izpeljemo. • Uporabimo diferencialno enačbo za črto • Ko povečamo koordinato X za 1 • Pobarvamo piksel kjer je Več Demo
Digitalni diferencialni analizator (DDA) DDA je algoritem rasterizacije (scan-conversion), ki upošteva, da je interval x vedno enak 1 (kar ustreza pomiku na naslednji stolpec pikslov). Zato velja: yk+1 = yk + m Najbližjo vrstico za yk+1dobimo tako z: y = (int) (yk+1 + 0.5)
Algoritem DDA m := (y2-y1) / (x2-x1); x := x1; y := y1; { initialise start position } error := 0; { no error yet } setpixel(x,y); while x<x2 do { while not past line end } begin error := error + m; {accumulate error } if error >= 1/2 then { largest error = 1/2 pixel } begin y := y+1; { step up one line } error := error-1; { error changed by 1 line } end; x := x+1; { next pixel along } setpixel(x,y); { plot the pixel } end;
Značilnosti algoritma DDA • Ugodnosti: • Ker uporablja rasterske značilnosti, je to hitrejše, kot stalno računanje y = mx + c • Možni problemi: • Akumulacija napake zaokroževanja po več zaporednih seštevanjih povzroči polzenje položajev pikslov od matematično pravilne črte • Napaka zaokroževanja se veča z dolžino črte • Zaokroževanje je še vedno računsko intenzivno.
Bresenhamov algoritem za risanje črt (BLA) • BLA (Bresenham’s Line Algorithm ) rasterizira črte samo s pomočjo inkrementalne celoštevilčne aritmetike. Algoritem je znan tudi pod imenom "MidPoint algoritem" (algoritem srednje točke) • BLA spet predpostavi vzorčenje črte v enotinih intervalih x. • BLA uporablja predznak (+ve/-ve) celega števila (p), katerega vrednost je sorazmerna: • razliki med dvema možnima vrednostima oddaljenosti od matematično računane črte • DDA uporablja realne vrednosti (vrednost error je frakcija), računanja s plavajočo vejico pa so počasna v primeri s celoštevilčnimi računi. • BLA je uporaben tako pri ravnih črtah kot pri krivuljah. Demo
Algoritem Midpoint • Predpostavimo korakanje algoritma od leve na desno (od zahoda proti vzhodu) • Izračunamo sredino (mid-point) med potencialno možnima piksloma v naslednjem stolpcu: E (east) in NE (North-east) • Pogledamo, na kateri strani "matematične" črte leži ta (srednja) točka. • Namesto enačbe y = mx + c uporabimo raje enačbo v obliki: • F(x) = (ax + by +c = 0). • Princip: Če je srednja točka M nad črto, izberemo E, sicer izberemo NE. NE • M E Demo
Algoritem Midpoint Pomagamo si s spremenljivko d = a(xp+1) + b(yp+1/2) + c Če je d > 0 , izberemo NE če jef d <=0 izberemo E. d računamo inkrementalno. Kaj se bo naredilo z M in d v naslednji vrstici? Izhajamo iz dveh primerov:predhodna izbiraje bila E ali NE
Algoritem Midpoint (nadaljevanje) Upoštevajmo, da za daljico med (x1,y1) in (x2,y2) velja enačba (y2-y1)x – (x2-x1)y + c = 0. a = dy = (y2-y1), b = -dx = -(x2-x1) in a + b = dy – dx kakšna naj bo začetna vrednost d ? Prva srednja točka M1= (x1+1, y1+1/2) F(M1) = d1 = ax1 + by1 + c + a + b/2 = F(x1,y1) + a + b/2 x1,y1je na črti , zato je F(x1,y1) = 0 zato je d1 = a + b/2 Želimo se izogniti deljenju z 2, zato za odločanje vzamemo 2d1 = 2a + b, saj to predznaka d ne spremeni.
Algoritem Midpoint (nadaljevanje) Če je bila predhodnaizbira NE, tedaj dnew= a(xp+2) + b(yp+3/2) + c ker pa je dold= a(xp+1) + b(yp+1/2) + c zato dnew= dold + a + b. Če je bila predhodna izbira E, tedaj dnew= a(xp+2) + b(yp+1/2) + c zato dnew= dold + a. dold dnew
Algoritem Midpoint dx = x2-x1 dy = y2-y1 d = 2*dy-dx x = x1 y = y1 while x < x2 if d <= 0 then d = d+(2*dy) x = x+1 else d = d+2*(dy-dx) x = x+1 y = y+1 endif SetPixel(x,y) endwhile initialisation chooseB chooseA
Prednosti inkrementalnega algoritma Midpoint • Je inkrementalen algoritem • Uporablja le celoštevilčno aritmetiko • Nudi najboljše prilagajanje približka dejanski črti
Algoritmi za kroge • Krog s polmerom rin središčem(xc, yc) je parametrično definiran kot: • Lahko bi postopno spreminjali qod 0 do 2pin risali koordinate: • težaven nadzor velikosti koraka in za odstranjevanje vrzeli ter minimizacijo prekrivanja
Rasterizacija kroga (0, 17) (17, 0) • Verzija 1– res slaba • for x = -R to R • y = sqrt(R •R – x •x); • Pixel (round(x), round(y)); • Pixel (round(x), round(-y)); • Verzija 2 – malo manj slaba • for x = 0 to 360 • Pixel (round (R • cos(x)), round(R • sin(x)));
R Uporabimo simetrijo • Simetrija: Če je (x0 + a, y0 + b) na krožnici , so na njej tudi • (x0± a, y0± b) and (x0± b, y0± a); Imamo 8 kratno simetrijo. • V praksi moramo upoštevati še, da sta x0iny0celi števili (položaj piksla)
Bresenhamov algoritem za kroge • Še ena metoda z “najmanjšo napako” • Uporabljamo enake poenostavitve kot pri risanju črt – rešitev velja za en oktant. • Enačba kroga jex2 + y2 = R2alix2 + y2 - R2 = 0 • Če x in y nista natančno na krožnici, box2 + y2 - R2različen od nič (napaka). • Error > 0 pomeni (x,y) je izven kroga,Error < 0 pomeni (x,y) je znotraj kroga.
Midpoint algoritem za krog • Implicitna enačba kroga: • Uporabimo podobno shemo, kot pri Midpoint algoritmu za črto: • Določiti moramo le piksle za en oktant, za ostale upoštevamo simetrijo • vzdržujemo odločitveno spremenljivko di, ki zavzema naslednje vrednosti: Demo
Midpoint algoritem za krog • Podobno kot pri črti določamo vrednost d tako, da vstavimo srednjo točko za naslednji piksel v implicitno enačbo kroga: • Če je di< 0 , izberemo piksel A, sicer izberemo piksel B • Opomba: tu predpostavljamo, da je središče kroga v izhodišču
Midpoint algoritem za krog • Podobno kot pri algoritmu za črto lahko tudi tu izbiro A ali B uporabimo za določitev nove vrednosti di+1 • Če je bil izbran A,velja: • Če je bil prej izbran B, velja :
Midpoint algoritem za krog • Če predpostavimo, da je polmer celoštevilčna spremenljivka, velja za prvi narisani piksel (0, r)in je začetna vrednost odločitvene spremenljivke: • Začetna vrednost je sicer realna, vse druge pa so cela števila. • lahko zaokrožimo navzdol:
Midpoint algoritem za krog d = 1-r x = 0 y = r while y < x if d < 0 then d = d+2*x+3 x = x+1 else d = d+2*(x-y)+5 x = x+1 y = y-1 endif SetPixel(cx+x,cy+y) endwhile initialisation stop at diagonal end of octant chooseA chooseB Translate to the circle center
Tehnike optimizacije • Simetrija
Skica inkrementalnega algoritma E • y = y0 + R; x = x0; Pixel(x, y); • For (x = x0+1; (x – x0) < (y – y0); x++) { • if (decision_var < 0) { • /* move east */ • update decision_var; • } • else { • /* move south east */ • update decision_var; • y--; • } • Pixel(x, y); • } • Note: can replace all occurrences of x0 and y0 with 0, 0 and Pixel (x0 + x, y0 + y) with Pixel (x, y) • Essentially a shift of coordinates SE
Poligoni • Objekti v 3D so predstavljeni s poligoni • Poligoni so osnovni gradniki v grafiki!
Rasterizacija poligonov • V interaktivni grafiki poligoni vladajo svet • Dva glavna razloga: • Najmanjši skupni imenovalec za ploskve • Katerokoli ploskev lahko predstavimo s poljubno natančnostjo • Zlepki, matematične funkcije, volumetrične izo-površine • Matematična enostavnost vodi v preproste algoritme upodabljanja • Take algoritme lahko vgradimo v strojno opremo
Rasterizacija poligonov • Trikotnik je najbolj preprost primerek poligona • Vse poligone lahko razbijemo na trikotnike • Trikotniki so zagotovo planarni in konveksni
Rasterizacija poligonov • Obstaja vrsta algoritmov za prikaz poligonov na rasterskih zaslonih. • Vsak izkorišča določene lastnosti prikazanih poligonov: • nekateri algoritmi so primerni le za trikotnike • drugi zahtevajo, da so poligoni konveksni, da se ne križajo in da nimajo lukenj Trikotniki konveksni konkavni prekrižani z luknjami
Rasterizacija poligonov • Klasičen in splošen algoritem je "Polygon scan conversion". • za vsako vrstico rastra določimo robove poligona, ki jo sekajo, računamo notranje dele vzdolž skenirne vrstice (razpon) in pobarvamo ustrezne piksle.
Rasterizacija poligonov • Za določanje mejnih pikslov na robovih lahko inkrementalno uporabimo midpoint algoritme za črte. • ne bo delovalo: • piksle si delijo sosednji poligoni • posebno slabo, če so poligoni napol prosojni • Zagotoviti moramo, da poligoni, ki imajo skupne robove, nimajo tudi skupnih pikslov.
Rasterizacija poligonov • Splošni postopek: • Določimo presečišča skenirne vrstice z robovi poligona • Presečišča uredimo glede na naraščajočo vrednost x • pobarvamo piksle med zaporednimi pari vrednosti x • Z obravnavo 4 primerov preprečujemo souporabo pikslov: • če je presečišče realna vrednost x, ali zaokrožimo navzdol ali navzgor? • če je znotraj (levo od razpona), zaokrožimo navzgor, če je zunaj (desno od razpona) zaokrožimo navzdol • kaj pa, če je presečišče celoštevilčna vrednost x ? • Na levi od razpona predvidevamo njegovo notranjost, sicer pa zunanjost • Kako pa je s skupnimi verteksi? • ignoriramo piksel, ki ustreza ymaxvrednosti roba • Kaj pa z vodoravnimi robovi? • Tako kot pri prejšnjem pravilu (spodnjih robov ne rišemo)