以矩陣來表示轉換
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。 請注意,兩個向量的點乘積是數位,而不是另一個向量。 另請注意,只有當兩個向量具有相同數量的元件時,您才能計算點乘積。
Let A(i, j) be the entry in matrix A in the ith row and the jth column. 例如,A(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 矩陣),稱為仿射轉換。 將仿射轉換儲存在一對矩陣中(一個用於線性部分,另一個用於轉譯)的替代方法是將整個轉換儲存在 3×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 乘以 A、B、C 相同的結果。
[2 1 1]D = [-2 5 1]
下圖顯示矩陣 A、B、C 和 D。
複合轉換的矩陣可以乘以個別轉換矩陣來形成,這表示任何一連串的仿射轉換都可以儲存在單 Matrix 一物件中。
警告
複合轉換的順序很重要。 一般而言,旋轉,然後縮放,然後轉譯與縮放比例不同,然後旋轉,然後轉譯。 同樣地,矩陣乘法的順序也很重要。 一般而言,ABC 與 BAC 不同。
類別 Matrix 提供數種方法來建置複合轉換: Multiply 、、 Rotate 、 RotateAtScale 、、 Shear 和 Translate 。 下列範例會建立複合轉換的矩陣,該矩陣會先旋轉 30 度,然後以 Y 方向的 2 乘以 2 為星號調整,然後轉譯 5 個單位的 x 方向:
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)
下圖顯示矩陣。