2D képszintézis Szirmay-Kalos László
Számítógépes grafika feladata képszintézis Virtuális világ modell modellezés Metafórák: 2D rajzolás világ = sík
Rasztergrafikus rendszerek LUT
2D képszintézis
Vektorizáció [0,1]: 0, t 1, t 2,..., t n, 1 r 1 =r(0), r 2 = r(t 2 ), …, r n = r(1) r1r1 r(t)r(t) r2r2 rn rn
Modellezési transzformáció [x, y] = o + u + v u x u y 0 v x v y 0 o x o y 1 [x, y, 1] = [ , , 1] TMTM
Ablak-nézet transzformáció X = (x-w x ) v w /w w + v x Y = (y-w y ) v h /w h + v y v w /w w 0 0 v h /w h 0 v x -w x v w /w w v y -w y v h /w h 1 [X, Y, 1] = [x, y, 1] TVTV
Összetett transzformáció l T V nézeti transzformáció számítása l for each object o –T M előállítása –T C = T M T V –for each point of object o: transzformáció T C -vel l endfor [X, Y, 1] = ([ , , 1] T M ) T V [X, Y, 1] = [ , , 1] (T M T V ) = [ , , 1] T C
Vágás l Vektorizáció miatt: pont, szakasz, poligon –Pontok vágása x > x min, x y min, y < y max x min x max y min y max
Szakasz vágás félsíkra l x(t) = x 1 + (x 2 - x 1 )t, y(t) = y 1 + (y 2 - y 1 )t l x = x max – Metszéspont: – x max = x 1 + (x 2 - x 1 )t t = (x max -x 1 )/(x 2 -x 1 ) l x i = x max y i = y 1 + (y 2 - y 1 ) (x max -x 1 )/(x 2 -x 1 ) x1, y1x1, y1 x2, y2x2, y2 x max xi, yixi, yi
Cohen-Sutherland vágás
#define Code(p) ((p.x < xmin) + ((p.y < ymin)<<1) + \\ ((p.x > xmax) ymax)<<3) bool LineClip(Vector& p1, Vector& p2) { for( ; ; ) { int c1 = Code(p1), c2 = Code(p2); if (c1 == 0 && c2 == 0) return true; if ((c1 & c2)) return false; if ((c1 & 1)) p1 = IntersectX(p1, p2, xmin); else if ((c1 & 2)) p1 = IntersectY(p1, p2, ymin); else if ((c1 & 4)) p1 = IntersectX(p1, p2, xmax); else if ((c1 & 8)) p1 = IntersectY(p1, p2, ymax); else if ((c2 & 1)) p2 = IntersectX(p1, p2, xmin); else if ((c2 & 2)) p2 = IntersectY(p1, p2, ymin); else if ((c2 & 4)) p2 = IntersectX(p1, p2, xmax); else if ((c2 & 8)) p2 = IntersectY(p1, p2, ymax); } Cohen-Sutherland algoritmus
Sutherland-Hodgeman poligonvágás PolygonClip(p[n] q[m]) m = 0; for( i=0; i < n; i++) { if (p[i] belső) { q[m++] = p[i]; if (p[i+1] külső) q[m++] = Intersect(p[i], p[i+1], vágóegyenes); } else { if (p[i+1] belső) q[m++] = Intersect(p[i], p[i+1], vágóegyenes); }
Pászta konverzió (raszterizáció) transzformációvágás raszterizációPixel műveletek rasztertár model Geometriai primitívek: microsec / primitív Pixelek nanosec / pixel
Szakasz rajzolás Egyenes egyenlete: y = mx + b Egyeneshúzás for( x = x1; x <= x2; x++) { Y = m*x + b; y = Round( Y ); write( x, y ); } x1x2
Inkrementális elv l Y(X) kiszámítása –Y(X) = F( Y(X-1) ) = Y(X-1) + dY/dX l Szakasz rajzolás: Y(X) = mX + b –Y(X) = F( Y(X-1) ) = Y(X-1) + m l Összeadás: fixpontos ábrázolás: y = Y 2 T –T: hiba < 1 a leghosszabb műveletsornál –N 2 -T log 2 N –round( y ): y+0.5-t csonkítjuk
DDA szakaszrajzolás DDADrawLine(x1, y1, x2, y2) { m = (y2 - y1)/(x2 - x1) y = y FOR X = x1 TO x2 { Y = round(y)trunc(y) WRITE(X, Y, color) y = y+m }
DDA szakaszrajzoló hardver X számlálóy regiszter x1 m y1 0.5 = XY CLK
Terület elárasztás működése Flood(x, y) { if (pixel[x][y] belső pont) { Write(x, y, color); Flood(x, y-1); Flood(x, y+1); Flood(x-1, y); Flood(x+1, y); } Belső pont = sötétkék mag
Területkitöltés l Geometriai reprezentáció alapján –p1,p2,...,pn csúcsok –p1-p2, p2-p3,...,pn-p1 élek l Belső pixel –páratlanszor metszünk élt, ha végtelenből jövünk –végtelen: vágás után a nézet széle
Területkitöltés p1 p2 p3 p4 y x1 x4x2x3
Kitöltés gyorsítása l Vizsgálatok csak az aktív élekre l Metszéspontszámítás inkrementális elv szerint y x(y) Dx/Dy x(y+1)x(y+2) Dx/Dy
Aktív él lista ymax Dx/Dy x nextAETymax Dx/Dy x next ymin=0 ymin=1 ymin=1024 ymax Dx/Dy x1 next ET: éltábla AET: aktív éltábla