2D képszintézis Szirmay-Kalos László
Számítógépes grafika modellezés Virtuális világ modell világ = sík képszintézis világ = sík Metafórák: 2D rajzolás
2D képszintézis
Vektorizáció r(t) r2 rn r1 [0,1]: t1= 0, t2 , ... , tn =1 r1 =r(0), r2 = r(t2), … , rn = r(1)
Modellezési transzformáció Sx 0 0 0 Sy 0 0 0 1 cos f sin f 0 -sin f cos f 0 0 0 1 1 0 0 0 1 0 px py 1 TM ux uy 0 vx vy 0 ox oy 1 (x, y) v u [x, y, 1] = [a, b, 1] (a, b) o [0, 0, 1] [ox oy 1 ] [1, 0, 1] [ox+ux oy+uy 1 ] [0, 1, 1] [ox+vx oy+vy 1 ] (x, y) = o + au + bv
Ablak-nézet transzformáció ww ablak vw nézet (x, y) (X, Y) wh vh TV (vx,vy) (wx,wy) X = (x-wx) vw/ww + vx Y = (y-wy) vh/wh + vy vw/ww 0 0 0 vh/wh 0 vx-wxvw/ww vy-wyvh/wh 1 [X, Y, 1] = [x, y, 1]
Összetett transzformáció [X, Y, 1] = ([a, b, 1] TM ) TV [X, Y, 1] = [a, b, 1] (TM TV ) = [a, b, 1] TC TV nézeti transzformáció számítása for each object o TM előállítása TC = TM TV for each point of object o: transzformáció TC -vel endfor
Vágás Vektorizáció miatt: pont, szakasz, poligon Pontok vágása x > xmin x < xmax y > ymin y < ymax ymax Ablak: Belső konvex Külső konkáv Félsík: Külső konvex xmax ymin xmin
Szakasz vágás félsíkra xmax xi, yi x2, y2 x1, y1 x(t) = x1 + (x2 - x1)t, y(t) = y1 + (y2 - y1)t x = xmax Metszéspont: xmax= x1 + (x2 - x1)t t = (xmax-x1)/(x2-x1) xi = xmax yi = y1 + (y2 - y1) (xmax-x1)/(x2-x1)
Cohen-Sutherland vágás Code = (y > ymax , x > xmax , y < ymin , x < xmin ) 1001 1000 1100 0001 0000 0100 0110 0011 0010
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ő) } Első pontot még egyszer a tömb végére
Konkáv sokszögek vágása 6 5 3 2 4 1
Raszterizáció model Geometriai primitívek: 0.1-1 microsec / primitív transzformáció vágás raszterizáció Pixel műveletek Pixelek néhány nanosec / pixel rasztertár
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 ); } x1 x2
Inkrementális elv Y(X) kiszámítása Szakasz rajzolás: Y(X) = mX + b Y(X) = F( Y(X-1) ) = Y(X-1) + dY/dX Szakasz rajzolás: Y(X) = mX + b Y(X) = F( Y(X-1) ) = Y(X-1) + m Összeadás: fixpontos ábrázolás: y = Y 2T T: hiba < 1 a leghosszabb műveletsornál N 2-T < 1: T > log2 N round( y ): y+0.5-t csonkítjuk
DDA szakaszrajzolás DDADrawLine(x1, y1, x2, y2) { m = (y2 - y1)/(x2 - x1) y = y1 + 0.5 FOR X = x1 TO x2 { Y = round(y) trunc(y) WRITE(X, Y, color) y = y+m }
DDA szakaszrajzoló hardver X Y X számláló y regiszter 0.5 = .10000002 CLK S x1 y1 m
Terület elárasztás működése Belső pont = sötétkék 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); } 2 2 1 2 mag 1 2 1 1 Flood 1 Write Flood(x,y-1); Flood(x,y+1); Flood(x-1,y); Flood(x+1,y); 2 Write Flood(x,y-1); Flood(x,y+1); Flood(x-1,y); Flood(x+1,y);
Területkitöltés Geometriai reprezentáció alapján Belső pixel p1,p2,...,pn csúcsok p1-p2, p2-p3,...,pn-p1 élek 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 Egyenesek = vízszintes pászták x1 x4 x3 x2 y p1 p3 Egyenesek = vízszintes pászták Amíg nincs metszéspont addig nincs változás (koherencia)
Kitöltés gyorsítása Vizsgálatok csak az aktív élekre Metszéspontszámítás inkrementális elv szerint Dx/Dy Dx/Dy y x(y) x(y+1) x(y+2)
Aktív él lista AET: aktív éltábla AET ymax Dx/Dy x next ymin=1024 ymax Dx/Dy x1 next ymax Dx/Dy x1 next ymin=1 ET: éltábla ymin=0