パスのバウンズを取得するときに、GraphicsPath.GetBoundsを利用することがありますが、引数に行列とペンを引き渡してバウンズを取得できる物も用意されています。

しかし実際に使ってみると、希望していたバウンズとは違う結果が取得されてしまいました。

Edge1

using (Pen pen = new Pen(Color.Black, 20))
using (Pen redPen = new Pen(Color.Red))
using (Pen bluePen = new Pen(Color.Blue))
using (GraphicsPath path = new GraphicsPath())
{
    path.AddLine(30, 30, 120, 120);
    e.Graphics.DrawPath(pen, path);

    RectangleF rc = path.GetBounds(null, pen);
    e.Graphics.DrawRectangle(redPen, rc.X, rc.Y, rc.Width, rc.Height);

    path.Widen(pen);
    rc = path.GetBounds();
    e.Graphics.DrawRectangle(bluePen, rc.X, rc.Y, rc.Width, rc.Height);
}

ソースを見てもらえれば判ると思いますが、赤で囲った矩形がGetBounds(Matrix, Pen)で取得したバウンズ、青で囲った矩形がWidenでペンをパス化した結果に対してGetBounds() したバウンズです。
結構余白が大きく入りますね。
ペンの太さが太かったり、矢印等のアンカーが付いていたりするとより顕著です。

より正確にバウンズを取得したい場合はGetBounds(Matrix, Pen)は使わないほうが良さそうです。
(動作速度もそこそこ差がありそうですが、今回は計っていません)

記事検索

アーカイブ