C# - DrawBezier és DrawBeziers függvények

Graphics osztály 2. rész

forráskód letöltése
E két függvény arra hivatott, hogy segítségükkel igen egyszerűen tetszőleges görbe vonalakat rajzoljunk. Ehhez a tetszőleges görbe megrajzolásához mindössze négy koordináta pontra (X, Y) lesz csak szükség. E négy ponttal egy tetszőleges alakú görbe leírható.
Mellékelt példában arra is mutatunk módszert, hogy egy kirajzolt görbe miként nagyítható, kicsinyíthető tetszőleges mértékben.
Amint azt a bevezetőben már említettük, mindössze négy koordináta pont elegendő egy görbe megrajzolásához. E négy pont a következőkből áll, ebben a sorrendben:
  • a görbe kezdőpontja
  • a görbéhez tartozó első segédpont
  • a görbéhez tartozó második segédpont
  • a görbe végpontja.
A kezdő és végpont egyértelmű, a két segédpont használatát pedig úgy képzeljük el, hogy a kezdőpontot és az első segédpontot összekötjük egy képzeletbeli egyenessel, valamint a végpontot és a második segédpontot szintén egy másik egyenessel, majd e két egyenes között alakul úgy a görbe, hogy annak íve egyenletes legyen. E két egyenes mozgatásával (vagyis a négy koordináta változtatásával) bármilyen görbe megvalósítható. A mellékelt példában a kék színű görbéhez tartozó segédvonalakat meg is jelenítjük két szürke színű egyenessel.
Nézzük most milyen függvények állnak rendelkezésünkre Bezier görbe rajzolásához.
DrawBezier
Osztály: System.Drawing.Graphics
public void DrawBezier(
Pen pen,
Point pt1,
Point pt2,
Point pt3,
Point pt4
);
A DrawBezier függvény segítségével egy darab Bezier görbe kirajzolására van lehetőségünk.
Paraméterek
Pen pen
A pen paraméter határozza meg a ceruza tulajdonságait, mellyel a görbe kirajzolása megtörténik.
Point pt1
pt1 paraméterbe kell megadnunk a görbe kezdőpontját.
Point pt2
pt2 paraméterbe jön az első segédpont koordinátája.
Point pt3
pt3 paraméterbe jön a második segédpont koordinátája.
Point pt4
pt4 paraméterbe kell megadnunk a görbe végpontját.
DrawBezier
Osztály: System.Drawing.Graphics
public void DrawBezier(
Pen pen,
PointF pt1,
PointF pt2,
PointF pt3,
PointF pt4
);
A DrawBezier függvény segítségével egy darab Bezier görbe kirajzolására van lehetőségünk. E változatában a függvénynek a koordinátákat PointF típusban adhatjuk meg. Erre általában akkor lesz szükségünk, ha a koordináta pontokat úgy számítjuk ki programból és ekkor elképzelhető, hogy tört értékeket kapunk, melyek egészre konvertálásával nem kell foglalkoznunk, ezt megteszi helyettünk a DrawBezier ezen változata.
Paraméterek
Pen pen
A pen paraméter határozza meg a ceruza tulajdonságait, mellyel a görbe kirajzolása megtörténik.
PointF pt1
pt1 paraméterbe kell megadnunk a görbe kezdőpontját.
PointF pt2
pt2 paraméterbe jön az első segédpont koordinátája.
PointF pt3
pt3 paraméterbe jön a második segédpont koordinátája.
PointF pt4
pt4 paraméterbe kell megadnunk a görbe végpontját.
DrawBezier
Osztály: System.Drawing.Graphics
public void DrawBezier(
Pen pen,
float x1,
float y1,
float x2,
float y2,
float x3,
float y3,
float x4,
float y4
);
A DrawBezier függvény segítségével egy darab Bezier görbe kirajzolására van lehetőségünk. A függvény e változatában úgy adhatjuk meg a koordináta pontokat, hogy nem kell Point, vagy PointF struktúrákat használnunk, hanem egyszerűen csak számokat adunk meg.
Paraméterek
Pen pen
A pen paraméter határozza meg a ceruza tulajdonságait, mellyel a görbe kirajzolása megtörténik.
float x1
A görbe kezdőpontjának x koordinátája.
float y1
A görbe kezdőpontjának y koordinátája.
float x2
A görbe első segédpontjának x koordinátája.
float y2
A görbe első segédpontjának y koordinátája.
float x3
A görbe második segédpontjának x koordinátája.
float y3
A görbe második segédpontjának y koordinátája.
float x4
A görbe végpontjának x koordinátája.
float y4
A görbe végpontjának y koordinátája.
DrawBeziers
Osztály: System.Drawing.Graphics
public void DrawBeziers(
Pen pen,
Point[] points
);
A DrawBeziers függvény használatával lehetőségünk van arra, hogy egy lépésben több Bezier függvényt rajzoljuk ki.
Paraméterek
Pen pen
A pen paraméter határozza meg a ceruza tulajdonságait, mellyel a görbe kirajzolása megtörténik.
Point[] points
points paraméterben kell megadnunk azokat a koordinátapontokat, melyek leírják az összes kirajzolandó Bezier görbét. Ügyeljünk a koordináta pontok helyes számára. Ugyanis több Bezier görbe kirajzolásakor az első görbe végpontja egyezni fog a második görbe kezdőpontjával, a második végpontja viszont a harmadik kezdőpontjával és így tovább. Ebből az következik, hogy csak az első görbe számára kell négy koordinátapontot megadni, majd ezt követően a második, illetve az összes többi görbéhez már elegendő annak két segédpontját és végpontját megadni, ebben a sorrendben.
Ha tehát a DrawBeziers függvénnyel egy görbét szeretnénk rajzolni, akkor a points tömb négy elemet kell hogy tartalmazzon. Ha két görbét, akkor 4 + 3 elemre van szükség a tömbben. Ha n db görbét, akkor 4 + (n - 1) * 3 db elem kell, amit számíthatnánk egyszerűbben így is: n * 3 + 1.
DrawBeziers
Osztály: System.Drawing.Graphics
public void DrawBeziers(
Pen pen,
PointF[] points
);
A DrawBeziers függvény használatával lehetőségünk van arra, hogy egy lépésben több Bezier függvényt rajzoljuk ki. A függvény e változata képes arra, hogy lebegőpontos számokat fogadjon koordinátáknak, melyeket természetesen egészre konvertál a kirajzolás folyamán.
Paraméterek
Pen pen
A pen paraméter határozza meg a ceruza tulajdonságait, mellyel a görbe kirajzolása megtörténik.
PointF[] points
points paraméterben kell megadnunk azokat a koordinátapontokat, melyek leírják az összes kirajzolandó Bezier görbét. A függvény e változatánál lehetőségünk van PointF típusban megadni a koordinátákat. Ügyeljünk a koordináta pontok helyes számára. Ugyanis több Bezier görbe kirajzolásakor az első görbe végpontja egyezni fog a második görbe kezdőpontjával, a második végpontja viszont a harmadik kezdőpontjával és így tovább. Ebből az következik, hogy csak az első görbe számára kell négy koordinátapontot megadni, majd ezt követően a második, illetve az összes többi görbéhez már elegendő annak két segédpontját és végpontját megadni, ebben a sorrendben.
Ha tehát a DrawBeziers függvénnyel egy görbét szeretnénk rajzolni, akkor a points tömb négy elemet kell, hogy tartalmazzon. Ha két görbét, akkor 4 + 3 elemre van szükség a tömbben. Ha n db görbét, akkor 4 + (n - 1) * 3 db elem kell, amit számíthatnánk egyszerűbben így is: n * 3 + 1.
A példaprogram
Az elmélet után térjünk át a gyakorlatra és nézzük miként is megy mindez egy programban.
Első lépésként biztos, hogy szükségünk lesz egy Pen osztályra, melyben leírjuk, hogy milyen legyen a megjelenő vonal tulajdonsága. Ezt követően szükségünk lesz négy koordinátára is, melyeket az egyszerűség kedvéért most egy tömbbe tárolunk el.
  private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
  {
    Pen p = new Pen(Color.Silver, 1);
    Graphics g = e.Graphics;
    Point[] po = {new Point(10, 10), new Point(200, 40), new Point(40, 140), new Point(210, 310)};
A mellékelt példában megvalósítjuk azt is, hogy a szemléltetés kedvéért megjeleníthető legyen a Bezier görbéhez tartozó két segédvonal. Ezek esetleges kirajzolása után a DrawBezier felhasználásával kirajzoljuk a tömbben tárolt görbénket.
    if (checkBox1.Checked)
    {
      g.DrawLine(p, po[0], po[1]);
      g.DrawLine(p, po[2], po[3]);
    }    
    p.Color = Color.Blue;
    g.DrawBezier(p, po[0], po[1], po[2], po[3]);
Nézzük most miként tudunk tetszőleges mértékben a program futási ideje alatt nagyítani, kicsinyíteni egy görbét. Ehhez nem kell mást tennünk, mint egy tetszőleges számmal megszoroznunk a görbe összes koordinátájának értékét, beleértve a segédpontokét is, mert e lépés nélkül a görbe elvesztené eredeti alakját a nagyítás, kicsinyítés során.
Az új koordinátákhoz létrehozunk egy új tömböt, PointF típusú elemekkel, mivel tört számmal fogunk szorozni, így az eredmény is tört lesz (általában). A nagyítás, kicsinyítés művelethez a már meglévő po tömbben lévő koordinátákból indulunk ki. Ezeket szorozzuk meg a Form-on lévő TrackBar aktuális értékének századrészével. Ezt követően már csak a kirajzolás marad hátra, melyhez most a DrawBezier azon változatát használjuk, mely tört számok fogadására is képes.
    PointF[] pof = new PointF[4];      
    for(int i=0; i<4; i++)
    {
      pof[i].X = po[i].X * trackBar1.Value / 100;
      pof[i].Y = po[i].Y * trackBar1.Value / 100;
    }
    p.Color = Color.Green;
    g.DrawBezier(p, pof[0], pof[1], pof[2], pof[3]);
Próbánk utolsó lépéseként több görbe együttes kirajzolását végezzük el. Ehhez egy olyan tömbre van szükségünk, mely tartalmazza az összes görbe koordinátájának pontját. Jól megfigyelhető a tömbben, hogy csak az első görbéhez tartozik négy koordináta, a többihez már három elegendő, mivel a végpont minden görbénél egybe kell hogy essen a következő kezdőpontjával.
    Point[] po2 = {
      new Point(100, 200), new Point(200, 200), new Point(200, 200), new Point(200, 100),
      new Point(200, 200), new Point(200, 200), new Point(300, 200),
      new Point(200, 200), new Point(200, 200), new Point(200, 300),
      new Point(200, 200), new Point(200, 200), new Point(100, 200)
    };
    p.Color = Color.Red;                
    g.DrawBeziers(p, po2);
  }

Graphics osztály cikksorozat