以矩陣來表示轉換

m×n 矩陣是一組以 m 列和 n 個數據行排列的數位。 下圖顯示數個矩陣。

Illustration of matrices.

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

Illustration of matrix addition.

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)

下圖顯示數個矩陣乘法範例。

Illustration of matrix multiplication.

如果您將平面中的某個點視為 1×2 矩陣,您可以將該點乘以 2×2 矩陣來轉換該點。 下圖顯示數個套用至點的轉換 (2, 1)。

Matrix transformation to a point in a plane.

上圖中顯示的所有轉換都是線性轉換。 某些其他轉換,例如轉譯,不是線性的,而且不能以 2×2 矩陣表示為乘法。 假設您想要從點 (2, 1) 開始旋轉 90 度,在 x 方向轉譯 3 個單位,並在 y 方向轉譯 4 個單位。 您可以使用矩陣乘法,後面接著矩陣加法來完成這項作業。

Illustration of matrix multiplication followed by a matrix addition.

線性轉換(乘以 2×2 矩陣乘法),後面接著轉譯(加入 1×2 矩陣),稱為仿射轉換。 將仿射轉換儲存在一對矩陣中(一個用於線性部分,另一個用於轉譯)的替代方法是將整個轉換儲存在 3×3 矩陣中。 若要使這項工作,平面中的點必須儲存在具有虛擬第 3 個座標的 1×3 矩陣中。 通常的技術是讓所有第三個座標都等於 1。 例如,點 (2, 1) 是以矩陣 [2 1 1] 表示。 下圖顯示仿射轉換(旋轉 90 度;在 x 方向轉譯 3 個單位,y 方向為 4 個單位),以單一 3×3 矩陣表示為乘法。

Illustration of an affine transformation.

在上述範例中,點 (2, 1) 會對應至點 (2, 6)。 請注意,3×3 矩陣的第三個數據行包含數位 0、0、1。 這一律適用于 3×3 矩陣的仿射轉換。 重要數位是資料行 1 和 2 中的六個數字。 矩陣的左上方 2×2 部分代表轉換的線性部分,而第三列的前兩個專案則代表轉譯。

Illustration of linear and translation part of a matrix transformation.

在 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。

Illustration of matrix A, B, C, and D.

複合轉換的矩陣可以乘以個別轉換矩陣來形成,這表示任何一連串的仿射轉換都可以儲存在單 Matrix 一物件中。

警告

複合轉換的順序很重要。 一般而言,旋轉,然後縮放,然後轉譯與縮放比例不同,然後旋轉,然後轉譯。 同樣地,矩陣乘法的順序也很重要。 一般而言,ABC 與 BAC 不同。

類別 Matrix 提供數種方法來建置複合轉換: Multiply 、、 RotateRotateAtScale 、、 ShearTranslate 。 下列範例會建立複合轉換的矩陣,該矩陣會先旋轉 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)

下圖顯示矩陣。

Matrix illustration of a composite transformation.

另請參閱