SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
2D grafikai algoritmusok
A quadtree/octtree algoritmus A floodfill algoritmus Belső vagy külső pont? Baricentrikus koordináták Körüljárási irány eldöntése Animáció
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
A quadtree/octtree algoritmus Legyen Ω 0 ⊂ R 2 egy négyzet, S 0 := {x1 , x2 ,..., x N } ⊂ Ω 0 egy véges ponthalmaz (vezérlő pontok), N min , Lmax ∈ N adottak. procedure build( Ω, S, L ); begin if ( L < Lmax ) and ( | S |≥ N min ) then begin ...(bontsuk fel Ω -t az Ω1, Ω 2 , Ω3 , Ω 4 egybevágó rész-négyzetekre)... build( Ω1, S ∩ Ω1, L + 1 ); build( Ω 2 , S ∩ Ω 2 , L + 1 ); build( Ω3 , S ∩ Ω3 , L + 1 ); build( Ω 4 , S ∩ Ω 4 , L + 1 ); end; end;
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
Ezekután a QT-háló generálása: build( Ω 0 , S0 ,0 );
Műveletigény: O( N ⋅ Lmax ) . Reprezentálása: fa-gráffal (elemek: cellák, élek: felbontások). 3D algoritmus: octtree (kocka 8-felé darabolása). Reguláris QT-háló: bármely két szomszédos cella méretének aránya legfeljebb 2.
Minden QT-háló regularizálható pótlólagos cellafelbontásokkal.
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
A floodfill algoritmus Belső pontok (pixelek) automatikus megkeresése procedure fill(x,y: integer); begin if (Pixels[x,y]<>col_border) and (Pixels[x,y]<>col_paint) then begin Pixels[x,y]:=col_paint; fill(x+1,y); fill(x,y+1); fill(x-1,y); fill(x,y-1); end; end;
Más adatstruktúrákban (pl. QT-hálón) is működik.
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
Belső vagy külső pont? ( xN y N ) ( x, y )
( x1, y1 )
( x3 , y3 )
( x2 , y2 )
Probléma: Adott egy N-szög a csúcspontjai sorozatával, és egy ( x, y ) pont. Döntsük el, hogy ( x, y ) az N-szög belsejében vagy külsejében (esetleg a határán) van!
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
1. megoldás: Jelölje Pk := ( xk , yk ) ( k = 1,2,..., N ) , és P := ( x, y ) . ( PN +1 := ( x1, y1 ) .) Számítsuk ki az α k := PPk Pk +1 előjeles szögeket N
( k = 1,2,..., N ). Ha a ∑ α k szögösszeg 2π , akkor P belső pont, ha 0, k =1
akkor külső pont. 2. megoldás: Húzzunk P-n keresztül egy tetszőleges félegyenest. Ha ez páratlan sokszor metszi a peremet, akkor P belső pont, ha páros sokszor, akkor külső pont.
3. megoldás (csak konvex sokszögekre működik): Ha a P pont mindegyik Pk Pk +1 egyenesnek ugyanazon oldalán fekszik, akkor P belső pont, egyébként külső pont.
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
P Pk +1
n Pk
n := ( Pk Pk +1 ) ⊥ = ( −( yk +1 − yk ) , ( xk +1 − xk )) e := Pk P = ( x − xk , y − yk ) Ha n, e > 0 , akkor P a Pk Pk +1 egyenes bal oldalán, ha n, e < 0 , akkor a jobb oldalán fekszik.
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
Baricentrikus koordináták ( x3 , y3 )
( x, y ) ( x1, y1 )
( x2 , y2 )
A háromszög belső ( x, y ) pontjai (és csak ezek) előállnak 3
( x, y ) = ∑ λ j ⋅ ( x j , y j ) j =1
konvex kombinációként: λ1, λ 2 , λ 3 > 0 , λ1 + λ 2 + λ 3 = 1.
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
λ1, λ 2 , λ3 : az ( x, y ) pontnak a ( x1, y1 ) , ( x2 , y2 ) , ( x3 , y3 ) pontokra vonatkoztatott baricentrikus koordinátái. Megoldva tehát a λ1x1 + λ 2 x2 + λ 3 x3 = x λ1 y1 + λ 2 y2 + λ 3 y3 = y λ1 + λ 2 + λ 3 = 1
egyenletrendszert, ha λ1, λ 2 , λ 3 > 0 , akkor ( x, y ) belső pont: ha valamelyik λ j negatív, akkor külső pont. Az eljárás konvex sokszögekre általánosítható.
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
Körüljárási irány eldöntése ( x3 , y3 )
( x1, y1 )
( x2 , y2 )
A P1P2 P3 körüljárási irány pozitív, ha P3 a P1P2 egyenes bal oldalán fekszik (ill. negatív, ha a jobb oldalán).
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
n := ( P1P2 ) ⊥ = (−( y2 − y1 ) , ( x2 − x1 )) e := P1P3 = ( x3 − x1, y3 − y1 )
Ha n, e > 0 , akkor a P1P2 P3 körüljárási irány pozitív, ha n, e < 0 , akkor negatív.
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
Animáció A mozgás újabb és újabb fázisait nem célszerű közvetlenül a grafikus memóriába írni (nem folyamatos mozgás illúzióját adja), hanem először egy háttérben alakítjuk ki a képet, amit utána közvetlenül (és gyorsan) megjelenítünk. var Bitmap: TBitmap;
Inicializálás: Bitmap := TBitmap.Create; Bitmap.Width := Form1.ClientWidth; Bitmap.Height:= Form1.ClientHeight;
SZE, Doktori Iskola. Számítógépes grafikai algoritmusok. Összeállította: Dr. Gáspár Csaba
A háttér puffer törlése: Brush.Color:=clWhite; Rectangle(0,0,Bitmap.Width,Bitmap.Height);
Rajzolás a háttér pufferbe: a Bitmap Canvas objektumán keresztül, pl. Bitmap.Canvas.Pen.Color := clBlue; Bitmap.Canvas.MoveTo(x1,y1); Bitmap.Canvas.LineTo(x2,y2);
A háttér puffer megjelenítése: Form1.Canvas.Draw(0,0,Bitmap);