矩陣運算——平移,旋轉,縮放
平時開發程式,免不了要對影象做各種變換處理。有的時候變換可能比較複雜,比如平移之後又旋轉,旋轉之後又平移,又縮放。
直接用公式計算,不但複雜,而且效率低下。這時可以藉助變換矩陣和矩陣乘法,將多個變換合成一個。 最後只要用一個矩陣對每個點做一次處理就可以得到想要的結果。
另外,矩陣乘法一般有硬體支援,比如3D 圖形加速卡,處理3D變換中的大量矩陣運算,比普通CPU 要快上1000倍。
下面是3類基本的2D圖形變換。
平移:
設某點向x方向移動 dx, y方向移動 dy ,[x,y]為變換前座標, [X,Y]為變換後坐標。
則 X = x+dx; Y = y+dy;
以矩陣表示:
1 0 0
[X, Y, 1] = [x, y, 1][ 0 1 0 ] ;
dx dy 1
1 0 0
0 1 0 即平移變換矩陣。
dx dy 1
旋轉:
旋轉相比平移稍稍複雜:
設某點與原點連線和X軸夾角為b度,以原點為圓心,逆時針轉過a度 , 原點與該點連線長度為R, [x,y]為變換前座標, [X,Y]為變換後坐標。
x = Rcos(b) ; y = Rsin(b);
X = Rcos(a+b) = Rcosacosb - Rsinasinb = xcosa - ysina; (合角公式)
Y = Rsin(a+b) = Rsinacosb + Rcosasinb = xsina + ycosa ;
用矩陣表示:
cosa sina 0
[X, Y, 1] = [x, y, 1][-sina cosa 0 ]
0 0 1
cosa sina 0
-sina cosa 0 為旋轉變換矩陣。
0 0 1
縮放
設某點座標,在x軸方向擴大 sx倍,y軸方向擴大 sy倍,[x,y]為變換前座標, [X,Y]為變換後坐標。
X = sx*x; Y = sy*y;
則用矩陣表示:
sx 0 0
[X, Y, 1] = [x, y, 1][ 0 sy 0 ] ;
0 0 1
sx 0 0
0 sy 0 即為縮放矩陣。
0 0 1
2D基本的模型檢視變換,就只有上面這3種,所有的複雜2D模型檢視變換,都可以分解成上述3個。
比如某個變換,先經過平移,對應平移矩陣A, 再旋轉, 對應旋轉矩陣B,再經過縮放,對應縮放矩陣C.
則最終變換矩陣 T = ABC. 即3個矩陣按變換先後順序依次相乘(矩陣乘法不滿足交換律,因此先後順序一定要講究)。