2.10 パス
2.10.1 形状の保存
Point や Size、Rectangle 構造体は座標やサイズを表し、矩形を表現することができました。しかし、Draw や Fill 系のメソッドを組み合わせた複雑な形状を表現することはできません。グラフィックスパスは、より複雑な形状をワールド座標で保存することができる仕組みです。
グラフィックスパスを利用するには System.Drawing.Drawing2D.GraphicsPath クラスを使います。
System.Object System.MarshalByRefObject System.Drawing.Drawing2D.GraphicsPath
public sealed class GraphicsPath : MarshalByRefObject, ICloneable, IDisposable
このクラスのコンストラクタは次のようなものがあります。
public GraphicsPath()
public GraphicsPath(FillMode fillMode)
fillMode には、多角形と同様に交差する内部をどのように塗りつぶすかを FillMode で設定する必要があります。デフォルトでは交差する内部を塗りつぶしません。
図形は、Graphics クラスの Draw や Fill 系のメソッドのように Add~() メソッドでパスに図形を追加します。パスは形状しか保存していないので輪郭や塗りつぶしという概念は持ちません。矩形を追加するなら AddRectangle() メソッド、楕円なら AddEllipse() メソッド、多角形なら AddPolygon() メソッドなどがあります。
public void AddRectangle(Rectangle rect)
public void AddEllipse(Rectangle rect)
public void AddEllipse(int x, int y, int width, int height)
public void AddPolygon(Point[] points)
このほかにも、多くの追加メソッドがあります。基本的には Graphics クラスの Draw や Fill 系メソッドに対応しているので説明は不要でしょう。図形を描画するわけではなく、形状を保持するだけなのでペンやブラシの情報は必要ありません。これらのメソッドを組み合わせれば、例えば鍵穴のような複雑な形を保存することができます。
GraphicsPath オブジェクトは、Graphics クラスの DrawPath() メソッドと FillPath() メソッドで描画できます。
public void DrawPath(Pen pen, GraphicsPath path)
pen パラメータにはパスの線の色や幅を設定するペンオブジェクトを、path パラメータにグラフィックスパスを指定します。DrawPath() メソッドは path が表す形状の輪郭を線で描画します。
public void FillPath(Brush brush, GraphicsPath path)
brush パラメータには塗りつぶしに使うブラシオブジェクトを、path パラメータにグラフィックスパスを設定します。塗りつぶしには path に設定されている多角形モードが採用されます。
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は、矩形と楕円を組み合わせた GraphicsPath オブジェクトを作成し、これを DrawPath() メソッドと FillPath() メソッドで描画しています。FillPath() メソッドでは多角形モードがデフォルトなので交差する内部が塗りつぶされていません。GraphicsPath オブジェクトを利用すれば、このように複雑な形状を保存したり再利用することができます。