次は、多角形の描画法を示すためにサンプルプロジェクトPolygonSampleを用意したので、実行してみてください。
このサンプルでは、画面半分の左側に三角形の輪郭を描画し、右半分に塗りつぶした三角形を描画しています。また、2つの三角形のサイズが見やすいように、基準となる縦線を描画しています。描画場所は、画面の中央・左側の中央・右の中央の三点です。このサンプルで重要なのは次の部分です。
//重要な部分だけ抜粋
public partial class Form1 : Form
{
private void Form1_Paint( object sender, PaintEventArgs e )
{
//描画する間隔
float addX = 10;
float addY = 10;
//三角形を描画
Graphics grfx = e.Graphics;
Pen pen = new Pen( Color.Red );
pen.Width = 10;
float half = ( this.ClientSize.Width ) / 2; //画面の半分
float height = this.ClientSize.Height - pen.Width - ( addY * 2 ) - 1; //画面の高さ
PointF[ ] drawPoints = new PointF[ ] {
new PointF( half / 2 , ( pen.Width * 3 )+ addY ),
new PointF( pen.Width + addX, height ),
new PointF( half - pen.Width - addX, height )
};
grfx.DrawPolygon( pen, drawPoints );
//基準線を引く
Pen pen2 = new Pen( Color.Blue );
float clientHalf = this.ClientSize.Width / 2;
float clinetQuarter = this.ClientSize.Width / 4;
grfx.DrawLine( pen2, clientHalf, 0, ClientSize.Width / 2, this.ClientSize.Height );
grfx.DrawLine( pen2, clinetQuarter, 0, clinetQuarter, this.ClientSize.Height );
grfx.DrawLine( pen2, clientHalf + clinetQuarter, 0, clientHalf + clinetQuarter, this.ClientSize.Height );
////塗りつぶした三角形を描画(極力左側に合わす)
height = this.ClientSize.Height - ( addY * 2 ) - ( pen.Width / 2 ) - 1;
float penHalf = ( pen.Width / 2 );
SolidBrush brush = new SolidBrush( Color.Black );
PointF[ ] fillPoints = new PointF[ ] {
new PointF( drawPoints[0].X + half + ( addX / 2) - penHalf , addY + ( float )( pen.Width * 1.5 ) ),
new PointF( drawPoints[2].X + pen.Width + ( addX * 2 ) + penHalf, height ),
new PointF( this.ClientSize.Width - ( addX * 2 ), height )
};
grfx.FillPolygon( brush, fillPoints );
}
}

多角形を描画するには、DrawPolygonメソッドもしくはFillPolygonメソッドを使用します。この2つのメソッドには、座標を任意の数指定します。このサンプルでは三角形を描画したいので3つの座標を指定しています。今回も両メソッドに引き渡す値が異なっている点に注意してください。極力合わせていますが、ピクセル単位のズレが生じているかもしれません。
あと、FillPolygonメソッドはもう1つ注意するべき点があります。それはSystem.Drawing.Drawing2D.FillModeです。FillPolygonメソッドにFillModeを指定すると塗りつぶす領域を変更できます。サンプルプロジェクトFillModeSampleを用意したので、このサンプルを実行して2つのモードを試してください。
//重要な部分だけ抜粋
public partial class Form1 : Form
{
private void Form1_Paint( object sender, PaintEventArgs e )
{
//位置に関する情報を設定
float half = ( this.DrawResion.Width ) / 2;
float addX = half / 4;
float addY = this.DrawResion.Top;
float left = this.DrawResion.Left + 1;
float width = this.DrawResion.Width - 1;
float height = this.DrawResion.Height;
float height1 = ( float ) ( height * 0.35 ) + addY;
//モードを指定して星型を描画
Graphics grfx = e.Graphics;
SolidBrush brush = new SolidBrush( Color.Black );
PointF[ ] drawPoints = new PointF[ ] {
new PointF( half, addY + 1 ),
new PointF( left + addX, height + addY - 1 ),
new PointF( width, height1),
new PointF( left, height1 ),
new PointF( width - addX, height - 1 + addY)
};
FillMode mode = ( FillMode ) this.FillModeList.SelectedIndex;
grfx.FillPolygon( brush, drawPoints, mode );
}
}

以上で図形の描画に関する解説は終わりです。次項では、Graffitiプロトコルについての解説を進めます。
