WisdomSoft - for your serial experiences.

2.10 パス

複数の基本図形を組み合わせた複雑な形状はパスとして表現できます。

2.10.1 形状の保存

Point や Size、Rectangle 構造体は座標やサイズを表し、矩形を表現することができました。しかし、Draw や Fill 系のメソッドを組み合わせた複雑な形状を表現することはできません。グラフィックスパスは、より複雑な形状をワールド座標で保存することができる仕組みです。

グラフィックスパスを利用するには System.Drawing.Drawing2D.GraphicsPath クラスを使います。

System.Drawing.Drawing2D.GraphicsPath クラス
System.Object
    System.MarshalByRefObject
        System.Drawing.Drawing2D.GraphicsPath
public sealed class GraphicsPath : MarshalByRefObject, ICloneable, IDisposable

このクラスのコンストラクタは次のようなものがあります。

GraphicsPath クラスのコンストラクタ
public GraphicsPath()
public GraphicsPath(FillMode fillMode)

fillMode には、多角形と同様に交差する内部をどのように塗りつぶすかを FillMode で設定する必要があります。デフォルトでは交差する内部を塗りつぶしません。

図形は、Graphics クラスの Draw や Fill 系のメソッドのように Add~() メソッドでパスに図形を追加します。パスは形状しか保存していないので輪郭や塗りつぶしという概念は持ちません。矩形を追加するなら AddRectangle() メソッド、楕円なら AddEllipse() メソッド、多角形なら AddPolygon() メソッドなどがあります。

GraphicsPath クラス AddRectangle() メソッド
public void AddRectangle(Rectangle rect)
GraphicsPath クラス AddEllipse() メソッド
public void AddEllipse(Rectangle rect)
public void AddEllipse(int x, int y, int width, int height)
GraphicsPath クラス AddPolygon() メソッド
public void AddPolygon(Point[] points)

このほかにも、多くの追加メソッドがあります。基本的には Graphics クラスの Draw や Fill 系メソッドに対応しているので説明は不要でしょう。図形を描画するわけではなく、形状を保持するだけなのでペンやブラシの情報は必要ありません。これらのメソッドを組み合わせれば、例えば鍵穴のような複雑な形を保存することができます。

GraphicsPath オブジェクトは、Graphics クラスの DrawPath() メソッドFillPath() メソッドで描画できます。

Graphics クラス DrawPath() メソッド
public void DrawPath(Pen pen, GraphicsPath path)

pen パラメータにはパスの線の色や幅を設定するペンオブジェクトを、path パラメータにグラフィックスパスを指定します。DrawPath() メソッドは path が表す形状の輪郭を線で描画します。

Graphics クラス FillPath() メソッド
public void FillPath(Brush brush, GraphicsPath path)

brush パラメータには塗りつぶしに使うブラシオブジェクトを、path パラメータにグラフィックスパスを設定します。塗りつぶしには path に設定されている多角形モードが採用されます。

コード1
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;

public class Test : Form
{
	protected override void OnPaint(PaintEventArgs e) 
	{
		base.OnPaint(e);
		GraphicsPath path = new GraphicsPath();
		path.AddRectangle(new Rectangle(10, 50, 200, 100));
		path.AddEllipse(new Rectangle(60, 10, 100, 200));

		e.Graphics.DrawPath(new Pen(Color.Black), path);

		e.Graphics.TranslateTransform(210F, 0F);
		e.Graphics.FillPath(new SolidBrush(Color.Black), path);
	}
	static void Main() 
	{
		Application.Run(new Test());
	}
}
実行結果
コード1 実行結果

コード1は、矩形と楕円を組み合わせた GraphicsPath オブジェクトを作成し、これを DrawPath() メソッドと FillPath() メソッドで描画しています。FillPath() メソッドでは多角形モードがデフォルトなので交差する内部が塗りつぶされていません。GraphicsPath オブジェクトを利用すれば、このように複雑な形状を保存したり再利用することができます。