轉:http://chensavvy.blog.163.com/blog/static/57157189200903185258/
旋轉平移矩陣在VC和三維建模中是十分重要的。
將 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 個單位。可通過先使用矩陣乘法再使用矩陣加法來完成此操作。
后面跟一平移(與 1×2 矩陣相加)的線性變換(與 2×2 矩陣相乘)稱為仿射變換。將仿射變換存儲於一對矩陣(一個用於線性部分,一個用於平移)的替換方案是將整個變換存儲於 3×3 矩陣。若要使其起作用,平面上的點必須存儲於具有虛擬第三坐標的 1×3 矩陣中。通常的方法是使所有的第三坐標等於 1。例如,矩陣 [2 1 1] 代表點 (2, 1)。下圖演示了表示為與單個 3×3 矩陣相乘的仿射變換(旋轉 90 度;在 x 方向上平移 3 個單位,在 y 方向上平移 4 個單位)。
在前面的示例中,點 (2, 1) 映射到了點 (2, 6)。請注意,3×3 矩陣的第三列包含數字 0,0,1。對於仿射變換的 3×3 矩陣而言,情況將總是如此。重要的數字是列 1 和列 2 中的 6 個數字。矩陣左上角的 2×2 部分表示變換的線性部分,第 3 行中的前兩項表示平移。
在 GDI+ 中,可以在 Matrix 對象中存儲仿射變換。由於表示仿射變換的矩陣的第三列總是(0,0,1),因此在構造 Matrix 對象時,只需指定前兩列中的 6 個數。Matrix myMatrix = new Matrix(0, 1, -1, 0, 3, 4) 語句構造上面圖形中顯示的矩陣。
復合變換
復合變換是一個接一個的變換序列。請考慮下面列表中的矩陣和變換:
矩陣 A
旋轉 90 度
矩陣 B
在 x 方向上縮放 2 倍
矩陣 C
在 y 方向上平移 3 個單位
如果從由矩陣 [2 1 1] 表示的點 (2, 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 不同。
下圖顯示該矩陣。