より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

Math.NETで移動・拡大・回転の行列の合成を扱う

以前、Vector3という便利なクラスが標準関数にあるという記事を投稿したのですが、行列についても同様なのかなと思ったのですが行列についてはなんともといったところです。

Matrix4x4クラスもありますが、私が扱いたい行列は4x4の行列同士の積ではなく、4x4の行列と4x1の行列の積といった組み合わせなのです。

というのも、3次元のスケーリングを扱う行列、2次元の平行移動を扱う行列をおさらいしており、これをプログラミングで動かせるクラスを探しているのです。

探してみると、Math.NETがあるのでこれを使えば出来そうです。

numerics.mathdotnet.com

using System;
using MathNet.Numerics.LinearAlgebra.Double;

namespace Matrix4x4
{
    internal class Program
    {
        private static void Main(string[] args)
        {
            // X 75 Y 93 平行移動させる
            var move = Matrix.Build.DenseOfArray(new[,]
            {
                {1d, 0d, 75d},
                {0d, 1d, 93d},
                {0d, 0d, 1d}
            });
            // 90°回転
            var rotateRadian = 90d * Math.PI / 180d;
            var rotate = Matrix.Build.DenseOfArray(new[,]
            {
                {Math.Cos(rotateRadian), -Math.Sin(rotateRadian), 0},
                {Math.Sin(rotateRadian), Math.Cos(rotateRadian), 0},
                {0, 0, 1}
            });
            // X -75 Y 93 平行移動させる
            var move2 = Matrix.Build.DenseOfArray(new[,]
            {
                {1d, 0d, -75d},
                {0d, 1d, -93d},
                {0d, 0d, 1d}
            });
            // 行列を適用する座標
            var position = Vector.Build.Dense(new[] {50d, 40d, 1d});
            Console.WriteLine(move * rotate * move2 * position);
        }
    }
}

f:id:rimever:20210119201250p:plain