以矩陣來表示轉換
更新:2007 年 11 月
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) 的轉換。
上圖所顯示的所有轉換皆為線性轉換。特定其他轉換是非線性的,例如轉換 (Translation),而且無法乘以 2×2 矩陣來表示。假設您想要以點 (2, 1) 做為開始、將它旋轉 90 度、在 X 方向轉換 3 個單位和在 Y 方向轉換 4 個單位。您可以使用矩陣加法之後的矩陣乘法來完成這項作業。
轉換 (加上 1×2 矩陣) 之後的線性轉換 (乘以 2×2 矩陣) 稱為仿射轉換 (Affine Transformation)。另一種將仿射轉換儲存為矩陣組 (其中一個做為線性部分,另一個做為轉換部分) 的方法是將整個轉換儲存在 3×3 矩陣中。若要執行這項工作,平面的其中一點必須以虛設的第三座標儲存於 1×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 部分代表轉換的線性部分,而第三個資料列的前兩個項目則代表轉換。
在 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。
藉由乘以個別轉換矩陣可形成複合轉換的矩陣,這表示仿射轉換的任何序列都可以儲存在單一 Matrix 物件中。
警告: |
---|
複合轉換的順序非常重要。通常,旋轉、然後縮放、然後轉換與縮放、然後旋轉、然後在轉換並不相同。同樣的,矩陣乘法的順序也很重要。一般而言,ABC 與 BAC 並不相同。 |
Matrix 類別提供幾個方法,用來建置複合轉換:Multiply、Rotate、RotateAt、Scale、Shear 和 Translate。下列範例建立複合轉換矩陣,它會先旋轉 30 度、然後在 Y 方向縮放 2 個係數,然後在 X 方向轉換 5 個單位:
Dim myMatrix As New Matrix()
myMatrix.Rotate(30)
myMatrix.Scale(1, 2, MatrixOrder.Append)
myMatrix.Translate(5, 0, MatrixOrder.Append)
Matrix myMatrix = new Matrix();
myMatrix.Rotate(30);
myMatrix.Scale(1, 2, MatrixOrder.Append);
myMatrix.Translate(5, 0, MatrixOrder.Append);
下列圖示將顯示該矩陣。