240 likes | 401 Views
2D képszintézis. Szirmay-Kalos László. Számítógépes grafika. modellezés. Virtuális világ modell. képszintézis. v il ág = s ík. Metafórák: 2D rajzolás. 2D megjelen ítési csővezeték. Világ. Referencia helyzet (modell ezési k oord). Modell Transzf,. vektorizáció. ablak.
E N D
2D képszintézis Szirmay-Kalos László
Számítógépes grafika modellezés Virtuális világ modell képszintézis világ = sík • Metafórák: • 2D rajzolás
2D megjelenítési csővezeték Világ Referencia helyzet (modellezési koord) Modell Transzf, vektorizáció ablak Képernyőre vetítés Képernyő v. appwindow Vágás + nézet transzf. nézet nézet (1,1) raszterizáció (-1,-1) Képernyő Normalizált eszköz
Vektorizáció r(t), t in [0,1] r2 rn r1 [0,1]: t1= 0,t2 = 1/n,... ,tn=1 r1 =r(0), r2 = r(t2),… ,rn= r(1)
Poligon háromszögekre bontása Nem-diagonál Konvex Konkáv diagonál
Fül pi-1 • pi fül, ha pi-1 – pi+1 diagonál • Fül levágható! • Fülvágás: • keress fület és nyissz! diagonál pi pi+1
Algoritmus? • Minden 4+ csúcsú sokszögnek van diagonálja, azaz mindegyik felbontható diagonálok mentén: • Két fül tétel: Minden legalább 4 csúcsú sokszögnek van legalább 2 füle.
Fülvágó algoritmus 1 3 2 4 3 0
Modellezési transzformáció Sx 0 0 0 Sy 0 00 1 cosf sinf 0 -sinfcosf 0 00 1 1 0 0 010 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
Képernyő projekció világ Normalizált eszköz Képernyő ww vw (1,1) (x, y) (X, Y) (xc, yc) wh vh (vx,vy) nézet (wx,wy) ablak (-1,-1) X = vw (xc+1)/2+vxY = vh (yc+1)/2+vy xc = 2(x-wx)/ww-1 yc = 2(y-wy)/wh-1 2/ww0 0 0 2/wh 0 -1-2wx/ww-1-2wy/wh 1 [xc, yc, 1] = [x, y, 1]
Vágás Pont vágás: • x > xmin= -1 x < xmax= +1 y > ymin= -1 y < ymax= +1 ymax (x, y) xmax Belül xmin ymin Kívül
Vágás • x > xmin xmin (x, y) Belül Kívül
Vágás • y > ymin Belül (x, y) ymin Kívül
Vágás • x < xmax xmax (x, y) Belül Kívül
Vágás • y < ymax Kívül Belül (x, y)
Szakasz vágás xmax x(t) = x1 + (x2 - x1)t, y(t) = y1 + (y2 - y1)t x = xmax • Metszés: • xmax= x1 + (x2 - x1)t t = (xmax-x1)/(x2-x1) xi = xmaxyi= y1 + (y2 - y1) (xmax-x1)/(x2-x1) xi,yi x2,y2 x1,y1
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); } } } Első pontot még egyszer a tömb végére
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 • 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 > log2N • 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
Háromszög kitöltés (X3,Y3) Dx/Dy Dx/Dy (X2,Y2) y x(y) x(y+1) x(y+2) (X1,Y1)
Terület elárasztás Belső pont = kék Flood(x, y) { if (pixel[x][y] inner point) { Write(x, y, color); Flood(x, y-1); Flood(x, y+1); Flood(x-1, y); Flood(x+1, y); } } 2 2 2 1 seed 1 1 2 0 1 0 Flood 1 Flood(x+1,y); Flood(x-1,y); Write Flood(x,y+1); Flood(x,y-1); 2 Flood(x,y+1); Flood(x-1,y); Flood(x,y-1); Flood(x+1,y); Write