次の方法で共有


変換の行列表現

m×n 行列は、m 行と n 列に配置された数値のセットです。 次の図は、いくつかのマトリックスを示しています。

行列の図。

個々の要素を追加することで、同じサイズの 2 つのマトリックスを追加できます。 次の図は、行列の加算の 2 つの例を示しています。

行列加算の図。

m×n 行列に n×p 行列を乗算することができ、結果は m×p 行列になります。 最初の行列の列数は、2 番目の行列の行数と同じである必要があります。 たとえば、4×2 行列に 2×3 行列を乗算して、4×3 行列を生成できます。

行列の平面内のポイントと行と列は、ベクトルと考えることができます。 たとえば、(2, 5) は 2 つの成分を持つベクトルであり、(3, 7, 1) は 3 つの成分を持つベクトルです。 2 つのベクトルのドット積は次のように定義されます。

(a, b) • (c, d) = ac + bd

(a, b, c) • (d, e, f) = ad + be + cf

たとえば、(2,3) と (5, 4) のドット積は (2)(5) + (3)(4) = 22 です。 (2,5, 1) および (4, 3, 1) のドット積は (2)(4) + (5)(3) + (1)(1) = 24 です。 2 つのベクトルのドット積は、別のベクトルではなく数値であることに注意してください。 また、2 つのベクトルに同じ数の成分がある場合にのみ、ドット積を計算できることにも注意してください。

A(i, j) を ith 行の行列 A と j 番目の列のエントリとします。 たとえば、A(3, 2) は、3 番目の行と 2 番目の列の行列 A のエントリです。 A、B、C が行列で、AB = C とします。C のエントリは次のように計算されます。

C(i, j) = (A の行 i) • (B の列 j)

次の図は、行列乗算の例をいくつか示しています。

行列乗算の図。

平面内の点を 1×2 行列と考える場合は、その点に 2×2 行列を乗算して変換できます。 次の図は、ポイント (2、 1) に適用されるいくつかの変換を示しています。

平面内の点への行列変換。

前の図に示す変換はすべて線形変換です。 翻訳などの他の変換は線形ではなく、2×2 行列で乗算として表すことはできません。 ポイント (2、 1) から始めて、90 度回転し、x 方向に 3 単位平行移動し、y 方向に 4 単位平行移動するとします。 これを実現するには、行列乗算の後に行列の加算を使用します。

行列乗算とそれに続く行列加算の図。

線形変換 (2×2 行列による乗算) とそれに続く翻訳 (1×2 行列の加算) はアフィン変換と呼ばれます。 アフィン変換を一対の行列 (線形部分用と平行移動用に 1 つ) に格納する代わりに、変換全体を 3×3 行列に格納します。 この作業を行うには、平面内の点をダミーの 3 番目の座標を持つ 1×3 行列に格納する必要があります。 通常の手法では、すべての 3 番目の座標を 1 に等しくします。 たとえば、点 (2, 1) は行列 [2 1 1] で表されます。 以下の図は、単一の 3×3 行列による乗算として表されるアフィン変換(90度回転、x方向に3単位、y方向に4単位の並進)を示しています。

アフィン変換の図。

前の例では、ポイント (2, 1) がポイント (2, 6) にマップされています。 3×3 行列の 3 番目の列には、数値 0、0、1 が含まれていることに注意してください。 これは常に、アフィン変換の 3×3 行列の場合です。 重要な数値は、列 1 と 2 の 6 つの数値です。 行列の左上の 2×2 部分は変換の線形部分を表し、3 番目の行の最初の 2 つのエントリは平行移動を表します。

行列変換の線形および翻訳部分の図。

GDI+ では、Matrix オブジェクトにアフィン変換を格納できます。 アフィン変換を表す行列の 3 番目の列は常に (0, 0, 1) であるため、Matrix オブジェクトを作成するときは、最初の 2 つの列に 6 つの数値のみを指定します。 ステートメント Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) は、前の図に示したマトリックスを構築します。

複合変換

複合変換は一連の変換であり、一方の変換の後にもう一方が続きます。 次の一覧のマトリックスと変換について考えてみましょう。

行列 変換
マトリックス A 90 度回転
マトリックス B x 方向に 2 倍率でスケーリングする
マトリックス C y 方向に 3 単位を平行移動する

行列 [2 1 1] で表される点 (2, 1) で始まり、A、B、C で乗算すると、ポイント (2, 1) は一覧表示された順序で 3 つの変換を受けます。

[2 1 1]ABC = [-2 5 1]

複合変換の 3 つの部分を 3 つの別々の行列に格納するのではなく、A、B、C を乗算して、複合変換全体を格納する 1 つの 3×3 行列を取得できます。 ABC = D とします。次に、D を乗算した点は、点に A、B、C を乗算した結果と同じ結果になります。

[2 1 1]D = [-2 5 1]

次の図は、行列 A、B、C、および D を示しています。

行列 A、B、C、D の図

複合変換の行列を個々の変換行列に乗算することによって形成できるということは、アフィン変換の任意のシーケンスを単一の Matrix オブジェクトに格納できることを意味します。

注意

複合変換の順序は重要です。 一般に、回転、拡大縮小、平行移動の順で行うことは、拡大縮小、回転、平行移動の順で行うこととは異なります。 同様に、行列乗算の順序も重要です。 一般に、ABC は BAC と同じではありません。

Matrix クラスには、複合変換を構築するための複数のメソッド (MultiplyRotateRotateAtScaleShear、および Translate) が用意されています。 次の例では、最初に 30 度回転し、次に y 方向に 2 の係数で拡大縮小し、次に x 方向に 5 単位を平行移動する複合変換の行列を作成します。

Matrix myMatrix = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
Dim myMatrix As New Matrix()
myMatrix.Rotate(30)
myMatrix.Scale(1, 2, MatrixOrder.Append)
myMatrix.Translate(5, 0, MatrixOrder.Append)

次の図は、マトリックスを示しています。

複合変換のマトリックス図。

参照