C#パスを使って図形を描く

コンピュータ

パスを使うと直線や曲線、四角形や楕円などを組み合わせ複雑な図形を作成することができます。
また、出来上がったパスを指定色で塗りつぶすなどペイントソフトでよくある機能をプログラミングで再現することも可能です。
今回作成した図形は、ベジエ曲線の組み合わせで作成しています。ベジエ曲線は2本の直線の長さ傾きを調整することで2点間で曲線の曲がりを表現します。パスやベジエ曲線の概念は理解するのは難しそうですが、GIMPなどのフォトレタッチソフトなどのパスと同じものだと思われますので、そちらで試してみると視覚的に理解しやすいです。

ソース

ファイル名:gpath.cs

using System;
using System.Windows.Forms;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace GPath
{
    class Form1 : Form
    {
        // コントロールの宣言
        PictureBox picbox1;

        // 画像を描画
        static Bitmap MyDrawImage()
        {
            Bitmap canvas = new Bitmap(200, 200);
            using(Graphics g = Graphics.FromImage(canvas))
            using(Pen pen = new Pen(Color.Pink, 1))
            {
                // 背景を透明に
                Color c = Color.FromArgb(0,255,255,255);
                SolidBrush brush = new SolidBrush(c);
                g.FillRectangle(brush, 0, 0, 200, 200);

                GraphicsPath myPath = new GraphicsPath();

                // 図形を描画
                Point point1 = new Point(100, 40);
                Point point2 = new Point(160, 0);
                Point point3 = new Point(200, 40);
                Point point4 = new Point(180, 80);
                Point point5 = new Point(180, 80);
                Point point6 = new Point(115, 155);
                Point point7 = new Point(100, 155);

                Point point11 = new Point(100, 40);
                Point point12 = new Point(40, 0);
                Point point13 = new Point(0, 40);
                Point point14 = new Point(20, 80);
                Point point15 = new Point(20, 80);
                Point point16 = new Point(85, 155);
                Point point17 = new Point(100, 155);

                Point[] points = new Point[] {point1, point2, point3, point4, point5, point6, point7};
                Point[] points2 = new Point[] {point11, point12, point13, point14, point15, point16, point17};

                myPath.StartFigure();
                myPath.AddBeziers(points);
                myPath.AddBeziers(points2);
                myPath.CloseFigure();

                // パスを塗りつぶし
                g.DrawPath(pen, myPath);
                brush = new SolidBrush(Color.Pink);
                g.FillPath(brush, myPath);
            }
            
            return canvas;
        }

        // Form1_Loadイベント
        void Form1_Load(object o, EventArgs e)
        {
            Text = "GPath";

            picbox1 = new PictureBox()
            {
                Size = new Size(200,200),
                Image = MyDrawImage(),
            };

            Controls.AddRange(new Control[]{picbox1});
        }
        // コンストラクタ
        Form1()
        {
            Load += Form1_Load;
        }
        [STAThread]
        static int Main(string[] args)
        {
            Application.Run(new Form1());
            return 1;
        }

    }//class
}//namespace

コンパイル

PS>csc ./gpath.cs

実行

PS>./gpath.exe

結果

コメント