以矩陣來表示轉換

m×n 矩陣是一組排列為 m 列和 n 欄的數字。 下圖顯示數個矩陣。

矩陣的圖解。

您可以藉由新增個別元素來新增兩個相同大小的矩陣。 下圖顯示兩個矩陣加法範例。

矩陣加法的圖解。

m×n 矩陣可以與 n×p 矩陣相乘,結果為 m×p 矩陣。 第一個矩陣中的欄數必須與第二個矩陣中的列數相同。 例如,4×2 矩陣可以與 2×3 矩陣相乘來產生 4×3 矩陣。

平面中的點和矩陣的列與欄均可視為向量。 例如,(2, 5) 是具有兩個元件的向量,而 (3, 7, 1) 是具有三個元件的向量。 兩個向量的點積定義如下:

(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。 請注意,兩個向量的點積是數字,而不是另一個向量。 另請注意,只有當這兩個向量具有相同數量的元件時,您才能計算點積。

假設 A(i, j) 為矩陣 A 中第 i 列第 j 欄上的項目。 例如,A(3, 2) 為矩陣 A 中第 3 列第 2 欄上的項目。 假設 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 矩陣相加),稱為仿射轉換。 將仿射轉換儲存在一對矩陣 (一個用於線性部分,另一個用於平移) 中的替代方法,是將整個轉換儲存在 3×3 矩陣中。 若要使其運作,平面中的點必須儲存在具有虛擬第 3 個座標的 1×3 矩陣中。 常用的技術是讓所有第 3 個座標都等於 1。 例如,點 (2, 1) 會以矩陣 [2 1 1] 表示。 下圖顯示仿射轉換 (旋轉 90 度;沿 x 方向平移 3 個單位,沿 y 方向平移 4 個單位),以與單一 3×3 矩陣相乘來表示。

仿射轉換的圖解。

在上述範例中,點 (2, 1) 會對應至點 (2, 6)。 請注意,3×3 矩陣的第三欄包含數字 0、0、1。 對於仿射轉換的 3×3 矩陣,情況總是如此。 重要的數字是第 1 欄和第 2 欄中的六個數字。 矩陣左上方的 2×2 部分代表轉換的線性部分,而第 3 列中的前兩個項目代表平移。

矩陣轉換線性與平移部分的圖解。

在 GDI+ 中,您可以將仿射轉換儲存在 Matrix (英文) 物件中。 由於代表仿射轉換的矩陣第三欄一律是 (0, 0, 1),因此,當您建構 Matrix (英文) 物件時,只需在前兩欄中指定六個數字。 陳述式 Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) 會建構如上圖所示的矩陣。

複合轉換

複合轉換是一連串的轉換,一個接著一個。 請考慮下列清單中的矩陣和轉換:

矩陣 轉換
矩陣 A 旋轉 90 度
矩陣 B 沿 x 方向縮放 2 倍
矩陣 C 沿 y 方向平移 3 個單位

如果從點 (2, 1) 開始 (以矩陣 [2 1 1] 表示),依序乘以 A、B 及 C,則點 (2, 1) 將依照列出的順序進行這三個轉換。

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

除了將複合轉換的三個部分儲存在三個不同的矩陣中,您還可以將 A、B 和 C 相乘,以取得儲存這整個複合轉換的單一 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 (英文) 類別提供數種方法來建置複合轉換:Multiply (部分機器翻譯)、Rotate (部分機器翻譯)、RotateAt (部分機器翻譯)、Scale (部分機器翻譯)、Shear (部分機器翻譯) 和 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)

下圖顯示矩陣。

複合轉換的矩陣圖解。

另請參閱