共用方式為


以矩陣來表示轉換

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) 成為 i 和 j資料 行中矩陣 A 中的專案。 例如,A (3,2) 是 3rd 資料列和第 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 度、將 3 個單位轉譯為 x 方向,然後以 y 方向轉譯 4 個單位。 您可以藉由執行矩陣乘法,後面接著加法矩陣來完成此作業。

此圖顯示矩陣乘法和加法如何旋轉點並轉譯兩次

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

此圖顯示矩陣乘法如何執行模擬轉換

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

圖例顯示前兩個數據行對 3x3 矩陣的模擬轉換最顯著

在 Windows GDI+ 中,您可以將 affine 轉換儲存在 Matrix 物件中。 由於代表關聯轉換之矩陣的第三個數據行一律會 (0、0、1) ,因此當您建構 Matrix 物件時,只會在前兩個數據行中指定六個數字。 語句 Matrix myMatrix(0.0f, 1.0f, -1.0f, 0.0f, 3.0f, 4.0f); 會建構上圖中顯示的矩陣。

複合轉換

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

  • 矩陣 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類別提供數種方法來建置複合轉換:Matrix::MultiplyMatrix::Rotate、Matrix::RotateAtMatrix::ScaleMatrix::一位Matrix::Translate。 下列範例會建立複合轉換的矩陣,它會先旋轉 30 度,然後依 Y 方向 2 的倍數縮放,然後轉譯 x 方向的 5 個單位。

Matrix myMatrix;
myMatrix.Rotate(30.0f);
myMatrix.Scale(1.0f, 2.0f, MatrixOrderAppend);
myMatrix.Translate(5.0f, 0.0f, MatrixOrderAppend);

下圖顯示矩陣。

此圖顯示以三角函數表示的矩陣,以及具有這些函式近似值的矩陣