HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Régió kezelés a grafikában


Régió 2. rész

Példaprogram letöltése

7841 bájt

A régiók kezelésének egy igen hasznos tulajdonságát vizsgáljuk meg mostani cikkünkben. Gyakorlatban igen sokszor előforduló probléma, hogy meg kell határoznunk hogy az egér aktuális koorinátája, vagy egy adott képernyő pont egy tetszőlegesen bonyolult grafikai objektumon belül vagy azon kívül van. Ennek eldöntése egy egyszerű téglalap esetén egyszerű számítás lenne, egy ellipszisnél már bonyolódna a helyzet, ha az eredményt szeretnénk kiszámítani, ha pedig több különböző grafikai objektum együttese esetén kellene számolnunk, akkor az már szinte a lehetetlenség határát súrolná.
Ilyen esetekben nagyon jól használhatóak a régiók, melyeknél teljesen mindegy a grafikai objektum bonyolultsága, a fenti kérdés egyszerűen eldönthető lesz.

A megvalósítandó feladat tehát a következő: adott néhány véletlenszerű pozíciójú és méretű ellipszis, melyeket XOR művelettel egymásra helyezünk. Vagyis az egymást átfedő területek minden esetben invertálódnak, így hol részei lesznek az egész rajznak, hol nem. Ezzel a módszerrel már elegendő mértékben bonyolult lesz a grafikai objektum, hogy számítással nehéz legyen meghatározni, hogy egy adott pont a grafikai objektum területén belül van, vagy kívül. A régió előállításához létrehozunk egy InitRegion nevű függvényt.
      private void InitRegion()
      {
        Random ra = new Random();
Mivel több grafikai objektum együtteséből létrejövő képre van szükségünk, ezért célszerű a GraphicsPath osztályt használnunk, így egyszerűen összefűzhetjük az egyes ellipsziseinket.
       GraphicsPath gp = new GraphicsPath();
        int x, y; 
Adott egy r változónk, mely egy Region típusú osztályt képvisel. Első lépésként ezt kiürítjük a MakeEmpty függvény hívásával.
        r.MakeEmpty();
Ezután egy ciklust kezdeményezünk az egyes ellipszisek megrajzolásához.
        for (int i=0; i<10; i++)
        {
          x=ra.Next(ClientSize.Width/2);
          y=ra.Next(ClientSize.Height/2);
A GraphicsPath-hoz az AddEllipse függvénnyel adjuk hozzá az egyes ellipsziseket.
          gp.AddEllipse(x, y, x+ra.Next(ClientSize.Width/2), y+ra.Next(ClientSize.Height/2));
Az így előállt képet pedig az aktuális régióhoz adjuk az Xor művelettel.
          r.Xor(gp);
        }    
Végül készítünk egy téglalapot, mely a Form aktuális méreténél 50 pixellel kisebb.
        Rectangle re = new Rectangle(50, 50, ClientSize.Width-100, ClientSize.Height-100);
Ezt a területet pedig kivágjuk a Region Complement függvényével, így egy olyan képet nyerünk majd a Form-on, mely körben egy 50 pixeles margót tartalmaz a Form széléhez képest.
        r.Complement(re);
        r.Xor(re);
      }
A grafikai objektum kirajzolását a Form Paint eseményénél végezzük el. Itt egy lineáris színátmenetes ecsetet készítünk és ezzel fogjuk a már létrehozott régiót kirajzolni a Form hátterére.
      protected void Form1_Paint (object sender, System.WinForms.PaintEventArgs e)
      {
        g = e.Graphics;        
        Brush b = new LinearGradientBrush(ClientRectangle, Color.Blue, Color.Lime, 45);
        g.FillRegion(b, r);        
      }
A feladat ettől kezdve már igen egyszerű: amikor mozog a Form területén az egér, akkor jön létre a MouseMove esemény. Ezt felhasználva megtudjuk, hogy merre jár az egér. A felmerülő kérdésre, hogy az egér aktuálisan a grafikai objektumunk területén belül vagy kívül van-e, a Region osztály IsVisible függvénye fogja a választ megadni. Ennek többféle változata is létezik. Az egyikben két egész számot kell megadni, mely a kérdéses pont koordinátái lesznek. Visszatérési értékként, ha igazat ad a függvény, akkor a megadott pont a régión belül található, ellenkező esetben azon kívül.
      protected void Form1_MouseMove (object sender, System.WinForms.MouseEventArgs e)
      {
        if (r.IsVisible(e.X, e.Y, g))
        {
          label1.Text = "Bent";
        }
        else
        {
          label1.Text = "Kint";
        }
      }
Az IsVisible függvény még jó néhány változattal rendelkezik. Ezek mindegyike azonos funkciót lát el, csupán a paraméterlistájukból ered a különbözőség. Így például találunk olyan IsVisible függvényt, mellyel nem csak egy pontot vizsgálhatunk, hanem akár egy téglalapot is. Ekkor paraméterként egy Rect típust kell átadnunk. Ha ez benne lesz a régióban, akkor a visszatérési érték ismét igaz, különben hamis lesz.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2001 évkönyv 194. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |