Matrixオブジェクトを使って

コントロールに図形を描画して移動させると、普通は下の写真の左から右みたいになる。

(赤い枠は元あった位置。)

これはコントロールのXY座標の各値が右下に行くほど大きくなっているから。

(なんか表現が変…。)

ソースはこんな感じ。

public partial class Form1 : Form
{
    /// <summary>移動させるか</summary>
    private bool isTranslate = false;

    public Form1()
    {
        InitializeComponent();
    }

    /// <summary>Paintイベント</summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void panel1_Paint(object sender, PaintEventArgs e)
    {        
        using (Graphics g = e.Graphics) 
        {
            Pen fiiPen = new Pen(Brushes.Blue);
            Pen drawPen = new Pen(Brushes.Red);

            //Matrix globalMatrix = new Matrix(1, 0, 0, -1, 0, this.panel1.Height);
            //g.MultiplyTransform(globalMatrix, MatrixOrder.Append);

            GraphicsPath gp1 = new GraphicsPath(FillMode.Winding);
            gp1.AddRectangle(new Rectangle(new Point(50, 50), new Size(50, 50)));

            GraphicsPath gp2 = (GraphicsPath)gp1.Clone();

            if (this.isTranslate) 
            {
                Matrix localMatrix = new Matrix();
                localMatrix.Translate(50, 50, MatrixOrder.Append);
                gp1.Transform(localMatrix);
            }
            
            g.FillPath(fiiPen.Brush, gp1);

            g.DrawPath(drawPen, gp2);

            //gp1.Transform(globalMatrix);
            //gp2.Transform(globalMatrix);
        }
    }

    /// <summary>移動ボタンクリックイベント</summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button1_Click(object sender, EventArgs e)
    {
        this.isTranslate = true;//移動させる
        this.panel1.Invalidate();//再描画
    }
}


でもこのグローバル座標系を左上に行くほど大きくしたいなんてことがある。

そんなときには先のコードのこの部分を有効にする。

 Matrix globalMatrix = new Matrix(1, 0, 0, -1, 0, this.panel1.Height);
 g.MultiplyTransform(globalMatrix, MatrixOrder.Append);


X軸を軸に上向きに180度回転させて、Panelコントロールの高さ分だけ下に平行移動、そんなMatrixオブジェクトを作成。

それをグローバル座標系に適用します。

あと、Paintイベントの最後の2行もしたほうがいい(今回はあまり関係ないけど…)。

 //こうしないとマウスでクリックしたときに正しい位置が取れなかった気がする…。
 gp1.Transform(globalMatrix);
 gp2.Transform(globalMatrix);


するとこうなる。


行列変換なんて最近初めて知ったので最初はよくわからなかったけど、やっと慣れてきた。

ちょっとずつまとめていきたいと思います。

※写真が切れていたので差し替えました。