C# - Bezier görbe rajzolása háttér kifestéssel

forráskód letöltése
Ebben a cikkben példát láthatunk arra, hogy miként rajzolhatunk Bezier görbét, valamint arra is fény derül, hogy egy Bezier görbe által határolt területet miként festhetünk ki egy adott háttérrel, mely lehet egy egyszerű szín, de akár egy tetszőleges színátmenet is.
A rajzoláshoz felhasználjuk a Form-unk Paint eseményét. Itt a paraméterként kapott PaintEventArgs típusú változóban rendelkezésünkre áll a Graphics osztály egy példánya, melyet felhasználhatunk a rajzoláshoz. Ez a Graphics osztály tartalmazza a DrawBezier függvényt, melynek segítségével egyszerűen rajzolhatunk Bezier görbéket.
Első paraméterként egy Pen objektumot kell megadnunk, mely a görbe rajzolás vonalának tulajdonságait határozza meg.
Egy-egy függvény hívással a görbe egy-egy ívét tudjuk megrajzolni úgy, hogy a görbe két végpontját és hozzájuk tartozó két segéd pont koordinátáját adjuk át. A függvénynek három változata is van, melyeknél az első Pen típusú paraméter megegyezik. Eltérés csak a két végpont és segédpontok koordinátáinak megadási lehetőségénél van. Egyik változatnál fel kell sorolnunk az x, y koordinátákat float típusban, a másiknál ezeket megadhatjuk Point típusban, míg a harmadiknál PointF típusban.
A megadásnál az első x, y pár a görbe kezdőpontja, majd ezt követi a két segédpont koordinátája végül a görbe végpontja.
  protected void Form1_Paint (object sender, System.WinForms.PaintEventArgs e)
      {
        Graphics g = e.Graphics;
        Pen p = new Pen(Color.Red, 3);
        g.DrawBezier(p, 10, 10, 10, 200, 200, 10, 200, 200);     
        g.DrawBezier(p, 10, 10, 10, 200, 10, 200, 200, 200);     
Ha görbe által megadott területtel is szeretnénk műveletet végezni, mint például a háttér kitöltése, akkor szükségünk lesz a GraphicsPath osztály használatára. Ennek segítségével létrehozhatunk egy olyan grafikai objektumot, melyet egy egységként kezelhetünk függetlenül attól, hogy rajzoláskor milyen eszközöket használtunk. Így például rajzolhatunk vegyesen görbét, egyenes vonalakat, téglalapot, bármit, majd a kész grafikát egy egységként kiszínezhetjük.
Ehhez létrehozunk egy GraphicsPath osztályt, majd egy LinearGradientBrush ecsetet, mellyel egy lineáris színátmenetet adhatunk meg kitöltő háttérként. A GraphicsPath osztály rendelkezik egy AddBezier függvénnyel, mellyel egy Bezier görbe adható hozzá az aktuális grafikánkhoz. Ennek paraméterezése megegyezik az előbbi DrawBezier-el, annyi különbséggel, hogy az első paraméter elmarad.
Amikor az AddBezier-t hasznájuk, akkor azonban a rajz még nem jelenik meg a képernyőn. Ez nyilván csak akkor lesz látható, mikor már minden grafikai objektumot hozzáadtunk a GraphicsPath-hoz. Megjeleníteni a kész ábrát például a Graphics osztály FillPath függvényének hívásával lehet, mely egyből színezi is a hátteret az első paramétereként megadott ecsettel. A második paraméterként a kirajzolandó GraphicsPath osztály változóját kell megadnunk.
      GraphicsPath gp = new GraphicsPath();
      Rectangle rect = new Rectangle(210, 10, 400, 400);         
      LinearGradientBrush brush = new LinearGradientBrush(rect, Color.Red, Color.White, LinearGradientMode.BackwardDiagonal); 
      gp.AddBezier(210, 10, 210, 200, 400, 10, 400, 200);        
      gp.AddBezier(210, 10, 210, 200, 210, 200, 400, 200);        
      g.FillPath(brush, gp);