C#のWinFormsでワールド変換で図形を回転4「カーソルキーで図形を移動する」

コンピュータ

カーソルキーの上下左右をおすと進行方向に図形が回転され移動するようにしてみました。

ソースコード

namespace Kaiten02;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        this.ClientSize = new Size(640, 480);
        this.KeyPreview = true;

        Bitmap bmp1 = new (64, 64);
        using(Graphics bmp_g = Graphics.FromImage(bmp1))
        {
            // 矢印
            PointF[] points = [
                new PointF(bmp1.Width/2, 0),
                new PointF(bmp1.Width-1, bmp1.Height-1),
                new PointF(bmp1.Width/2, bmp1.Height*2/3),
                new PointF(0, bmp1.Height-1),
                new PointF(bmp1.Width/2, 0),
            ];
            // 三角
            PointF[] points2 = [
                new PointF(0, 0),
                new PointF(8, 0),
                new PointF(0, 8),
                new PointF(0, 0),
            ];

            bmp_g.FillPolygon(Brushes.White, points); // 塗潰し
            bmp_g.DrawLines(Pens.Black, points); // 縁取り
            bmp_g.FillPolygon(Brushes.Pink, points2); // 中心
        }
        PictureBox picbox = new()
        {
            BackColor = Color.Navy,
            Parent = this,
            Size = new Size(640, 480),
        };

        int r = 0;
        int x = 0;
        int y = 0;

        picbox.Paint += (s, e) =>
        {
            var g = e.Graphics;

            g.ResetTransform();

            // 中心へ移動
            g.TranslateTransform(picbox.Width/2-bmp1.Width/2+x, picbox.Height/2-bmp1.Height/2+y);

            // 回転
            g.TranslateTransform(bmp1.Width/2, (bmp1.Height/2));

            g.RotateTransform(r);

            g.TranslateTransform(-bmp1.Width/2, -(bmp1.Height/2));

            // 描画
            g.DrawImage(bmp1, 0, 0);
        };
        this.KeyDown += (s, e) =>
        {
            if (e.KeyCode == Keys.Left)
            {
                // 左
                r = 270;
                x -= bmp1.Width/8;
                picbox.Invalidate();
            }
            else if (e.KeyCode == Keys.Right)
            {
                // 右
                r = 90;
                x += bmp1.Width/8;
                picbox.Invalidate();
            }
            else if (e.KeyCode == Keys.Up)
            {
                // 上
                r = 0;
                y -= bmp1.Height/8;
                picbox.Invalidate();
            }
            else if (e.KeyCode == Keys.Down)
            {
                // 下
                r = 180;
                y += bmp1.Height/8;
                picbox.Invalidate();
            }
        };
    }
}

初期

カーソルキー上

カーソルキー右

カーソルキー下

カーソルキー左

カーソルキーの入力で回転角度、X座標の移動量、Y座標の移動量の変数の数値を増減させて、picbox.Invalidate()でPaintイベントを発生させます。
Paintイベントでまず図形を中心に移動します。そのさいX座標とY座標の移動量を加えています。
次に図形を回転させます。回転する角度は先にカーソルキーの入力でセットした値を使います。
最後に図形をg.DrawImage()で描画しています。

コメント