36
Računarska Računarska grafika grafika predavanja predavanja doc.dr. Samir Lemeš doc.dr. Samir Lemeš [email protected] [email protected]

RG 27 Renderisanje Linije i Kruznice

Embed Size (px)

DESCRIPTION

rg

Citation preview

  • Raunarskagrafikapredavanjadoc.dr. Samir [email protected]

  • 28. RasterizacijaRasterizacija linijaDDA algoritamBresenhamov algoritamRasterizacija krugaRasterizacija elipseRasterizacija trougla

  • RasterizacijaPretvaranje iz kontinuiranog u diskretno

  • Malo matematike

    Data je trea taka na liniji: P = (X,Y)

    Nagib = (Y - Y1)/(X - X1) = (Y2 - Y1)/(X2 - X1)

    Rjeenje po YY = [(Y2-Y1)/(X2-X1)]X + [-(Y2-Y1)/(X2-X1)]X1 + Y1iliY = mx + b

    241234563561P1 = (X1,Y1)P2 = (X2,Y2)P = (X,Y)

  • Jednaine linijePitanje: Koji je implicitni oblik jednaine linije?Ax + By + C = 0

    Pitanje: Ako se znaju koordinate take (x,y), ta se dobije uvrtavanjem tih vrijednosti u jednainu linije?Da li je taka:Na liniji: Ax + By + C = 0 "Iznad" linije: Ax + By + C > 0 "Ispod" linije: Ax + By + C < 0

  • Druge korisne formuleDuina segmenta linije izmeu P1 i P2:L = [ (X2-X1)2 + (Y2-Y1)2 ]

    Srednja taka segmenta linije izmeu P1 i P3:P2 = ( (X1+X3)/2 , (Y1+Y3)/2 )

    Dvije linije su okomite ako je1) M1 = -1/M22) Kosinus ugla izmeu njih 0.

  • Parametarski oblik jednaine 2D LinijeDate su take P1 = (X1, Y1) i P2 = (X2, Y2)

    X = X1 + t(X2-X1)Y = Y1 + t(Y2-Y1)

    t se naziva "parametar". Kad jet = 0 dobije se (X1,Y1)t = 1 dobije se (X2,Y2)

    Kako je 0 < t < 1 dobiju se sve ostale take na segmentu linije izmeu (X1,Y1) i (X2,Y2).

  • Osnovni algoritmi za liniju i krug1. Moraju se izraunati cjelobrojne koordinate piksela koji lee na ili u blizini linije ili kruga.2. Algoritmi za vrednovanje piksela se pozivaju stotinama ili hiljadama puta svaki put kad se slika kreira ili promijeni.3. Linije moraju formirati vizualno prihvatljive slike.Linije moraju izgledati praveLinije moaju imati precizno definisane krajeveLinije moraju imati konstantnu debljinuDebljina linije ne smije zavisiti od duine i nagiba linije.4. Algoritmi za linije moraju uvijek biti definisani.

  • Jednostavni DDA algoritam za linije{Zasnovan na parametarskoj jednaini linije}Procedure DDA(X1,Y1,X2,Y2 :Integer);Var Length, I:Integer;X,Y,Xinc,Yinc:Real;BeginLength := ABS(X2 - X1);If ABS(Y2 - Y1) > Length ThenLength := ABS(Y2-Y1);Xinc := (X2 - X1)/Length;Yinc := (Y2 - Y1)/Length;X := X1;Y := Y1;For I := 0 To Length DoBeginPlot(Round(X), Round(Y));X := X + Xinc;Y := Y + YincEnd {For}End; {DDA}

    Digital Differential Analyzer (Digitalni diferencijalni analizator)

    DDA kreira dobre linije ali je prespor zbog funkcije "round" i sporih operacija nad realnim brojevima.

  • DDA primjerIzraunati koji pikseli trebaju biti ukljueni da prikau liniju od (6,9) do (11,12).

    Duina := Max od (ABS(11-6), ABS(12-9)) = 5Xinc := 1Yinc := 0.6

    Izraunate vrijednosti su: (6,9), (7,9.6), (8,10.2), (9,10.8),(10,11.4), (11,12)

  • Jednostavni algoritmi za krugJednaina kruga radijusa r sa centrom u (0,0) glasi:x2 + y2 = r2, oigledno treba nacrtati:y = (r2 - x2)za -r
  • Bresenhamov algoritamPretpostavka: crtanje linije nagiba m od 0 do 1

    Koristi se implicitna jednaina linije: y = mx + B gdje je m nagib linije a B je presjek sa y.

  • Brze linijeSljedei piksel je desno (E) ili desno gore (NE)

    Ako je d pozitivno linija sijee iznad srednje take i blia je taki T. Ako je d negativno, linija sijee ispod srednje take i blia je taki S. Da bi se izabrala prava taka treba samo znati predznak take d.NE na (x+1, y+1)E na (x+1,y)P na (x,y)d u srednjoj taki (x+1, y+1/2)

  • Brze linije varijabla odlukedi = f(xi+1,yi+ 1/2 ) = a(xi+1) + b(yi+ 1/2) + c = axi + byi+ c + a + b/2= f(xi, yi) + a + b/2

    di je poznata kao varijabla odluke.

    Algoritam:Ako je di 0 izaberi NE = (xi + 1, yi + 1) kao sljedeu taku

    di+1 = f(xi+1 + 1, yi+1 + 1/2) = f(xi +1+1,yi +1+1/2)= a(xi +1+1) + b(yi +1+1/2) + c = f(xi + 1, yi + 1/2) + c + a + b (vidi prvi red iznad)= di + a + b

    A ako nije, izaberi E = (xi + 1, yi) kao sljdeu taku

    di+1= f(xi+1 + 1, yi+1 + 1/2) = f(xi +1+1,yi +1/2)= a(xi +1+1) + b(yi +1/2) + c = f(xi + 1, yi + 1/2) + a = di + a

  • Bresenhamov algoritam za linijuSamo vrijednost koja nije cjelobrojna je b/2 u poetnoj varijabli odluke. Moe se pomnoiti sa 2 da bi se izbjeglo dijeljenje.

    Begin {Bresenham za linije s nagibom od 0 do 1}a := ABS(xend - xstart);b := ABS(yend - ystart);d := 2*a + b;If xstart > xend Then Beginx := xend;y := yendEndElse Beginx := xstart;y := ystartEnd;For I := 0 to a Do BeginPlot(x,y);x := x + 1;If d 0 Then Beginy := y + 1;d := d + a + bEndElse d := d + aEnd {For Loop}End; {Bresenham}

  • OptimizacijeBrzina se moe jo vie poveati otkrivanjem ciklusa kod varijable odluke. Ti ciklusi odgovaraju ponavljajuem nizu izbora piksela.

    Ponavljajui niz se snimi i ako se otkrije ciklus, ponavlja se bez ponovnog prorauna.

    di= 2 -6 6 -2 10 2 -6 6 -2 10

  • Algoritam za crtanje krugaPotrebno je samo izraunati vrijednosti na rubu kruga u prvom oktantu. Ostale vrijednosti se mogu dobiti simetrijom. Polazi se od kruga radijusa r s centrom u (0,0).

    Procedure Circle_Points(x,y :Integer);BeginPlot(x,y);Plot(y,x);Plot(y,-x);Plot(x,-y);Plot(-x,-y);Plot(-y,-x);Plot(-y,x);Plot(-x,y)End;

  • Brzi krugoviAko se uzme u obzir samo prvi oktant kruga radijusa r sa centrom u koordinatnom poetku. Poinje se crtanjem take (r,0) a zavrava kad bude x < y.

    Odluka u svakom koraku je da li odabrati piksel direktno iznad posmatranog piksela ili piksel koji je iznad i ulijevo (8-smjerna simetrija).

    Pretpostavke: Pi = (xi, yi) je piksel koji se posmatra.Ti = (xi, yi +1) je piksel direktno iznad njegaSi = (xi -1, yi +1) je piksel iznad i ulijevo od njega.

  • Brzi krugovi varijable odlukef(x,y) = x2 + y2 - r2 = 0

    f(xi - 1/2 + e, yi + 1) = (xi - 1/2 + e)2 + (yi + 1)2 - r2= (xi- 1/2)2 + (yi+1)2 - r2 + 2(xi-1/2)e + e2= f(xi - 1/2, yi + 1) + 2(xi - 1/2)e + e2 = 0Let di = f(xi - 1/2, yi+1) = -2(xi - 1/2)e - e2

    Ako je e < 0 onda je di > 0 pa se bira taka S = (xi - 1, yi + 1).di+1 = f(xi - 1 - 1/2, yi + 1 + 1) = ((xi - 1/2) - 1)2 + ((yi + 1) + 1)2 - r2= di - 2(xi -1) + 2(yi + 1) + 1 = di + 2(yi+1- xi+1) + 1

    Ako je e 0 onda je di 0 pa se bira taka T = (xi, yi + 1).di+1 = f(xi - 1/2, yi + 1 + 1) = di + 2yi+1 + 1P = (x ,y )T = (x ,y +1)S = (x -1,y +1)iiiiiie(x -1/2, y + 1)ii

  • Brzi krugovi varijable odlukePoetna vrijednost za di je d0 = f(r - 1/2, 0 + 1) = (r - 1/2)2 + 12 - r2= 5/4 - r {1-r se moe koristiti ako je r cijeli broj}

    Kad se izabere taka S = (xi - 1, yi + 1) onda je di+1 = di + -2xi+1 + 2yi+1 + 1

    Kad se izabere taka T = ( xi , yi + 1) onda jedi+1 = di + 2yi+1 + 1

  • Algoritam za brzi krugBegin {Circle}x := r;y := 0;d := 1 - r;RepeatCircle_Points(x,y); y := y + 1;If d < 0 Then d := d + 2*y + 1Else Beginx := x - 1;d := d + 2*(y-x) + 1EndUntil x < yEnd; {Circle}

  • Brze ElipseAlgoritam za krug se moe generalizovati da bi radio sa elipsom ali se moe koristiti sako 4-smjerna simetrija.

    Moraju se izraunati sve take u jednom kvadrantu. Kako je Bresenhamov algoritam ogranien samo na jedan oktant, proraun se mora vriti u dva koraka. Promjena se deava kad se postigne taka na elipsi u kojoj tangenta na elipsu u njoj ima nagib od 1. U prvom kvadrantu, to se deava kad obje koordinate x i y imaju vrijednost 0.707 svog maksimuma.

  • Rasterizacija trouglaTrougao se moe definisati kao presjek tri pozitivne poluravni:

    A1x + B1y + C1 < 0A2x + B2y + C2 < 0A3x + B3y + C3 < 0A1x + B1y + C1 > 0A3x + B3y + C3 > 0A2x + B2y + C2 > 0

  • Rasterizacija trouglaUkljueni su samo oni pikseli kod kojih su sve jednaine stranica trougla > 0:

  • Rasterizacija trouglaZa svaki piksel je potrebnoIzraunati jednaine linija u centru piksela"odsjei" dio povrine oko trougla

  • Rasterizacija trouglaZa svaki piksel je potrebnoIzraunati jednaine linija u centru piksela"odsjei" dio povrine oko trouglaProblem?Ako je trougao mali, ima previe beskorisnog prorauna

  • Rasterizacija trouglaUnapreenje: Raunati samo piksele trougla koji su unutar gabarita ekranaKako se odredi taj gabarit?Xmin, Xmax, Ymin, Ymax vrhova trougla

  • Moderne grafike karticeTrouglovi su obino jako maliProblematino podeavanjeOdsijecanje je naporno

  • Moderna rasterizacijaZa svaki trougaoIzraunajProjekcijeIzraunaj gabarit, odsijeci gabarit do granica ekranaZa sve piksele unutar gabaritaIzraunaj jednaine linijaAko su sve jednaine linija>0 //piksel [x,y] unutar trouglaFramebuffer[x,y]=BojaTrougla

  • Moderna rasterizacijaZa svaki trougaoIzraunajProjekcijeIzraunaj gabarit, odsijeci gabarit do granica ekranaZa sve piksele unutar gabaritaIzraunaj jednaine linijaAko su sve jednaine linija>0 //piksel [x,y] je unutar trouglaFramebuffer[x,y]=BojaTrouglaOdsijecanje gabarita je trivijalno, za razliku od odsijecanja trougla

  • Moe li bolje?Za svaki trougaoIzraunajProjekcijeIzraunaj gabarit, odsijeci gabarit do granica ekranaZa sve piksele unutar gabaritaIzraunaj jednaine linijaAko su sve jednaine linija>0 //piksel [x,y] unutar trouglaFramebuffer[x,y]=BojaTrougla

  • Moe li bolje?Za svaki trougaoIzraunajProjekcijeIzraunaj gabarit, odsijeci gabarit do granica ekranaZa sve piksele unutar gabaritaIzraunaj jednaine linija ax+by+cAko su sve jednaine linija>0 //piksel [x,y] je unutar trouglaFramebuffer[x,y]=BojaTrouglaNe mora se svaki put ponovo izraunavati jednaina linije ispoetka

  • Moe li bolje?Za svaki trougaoIzraunajProjekcijeIzraunaj gabarit, odsijeci gabarit do granica ekranaPodesi jednainu linije izraunaj aidx, bidy za 3 linijeDaj poetne vrijednosti jednaina linija, vrijednosti za vrhove gabaritaLi=aix0+biy+ciZa svaku liniju skeniranja y unutar gabaritaZa 3 linije, auriraj LiZa sve x unutar gabaritaInkrementiraj jednaine linija: Li+=adxAko su sve Li>0 //piksel [x,y] unutar trouglaFramebuffer[x,y]=BojaTrouglaUteda: po jedno mnoenje za svaki piksel

  • Moe li bolje?Izraunavaju se jednaine linija za veliki broj piksela koji se ne koristeta se moe uraditi?

  • Moe li bolje?Hijerarhijska rasterizacijaObino u dva nivoaTada je samo pitanje odreivanja prave granulacije

  • U modernom hardveruJednaine stranica trougla u homogenim koordinatama [x, y, w]Podjela da bi se dodala granulacija srednjeg nivoaRano se odbacuju beskorisna podrujaKoherentan pristup memoriji

    *