矩陣運算 平移,旋轉,縮放

2021-07-27 09:13:55 字數 1404 閱讀 5537

平時開發程式,免不了要對影象做各種變換處理。有的時候變換可能比較複雜,比如平移之後又旋轉,旋轉之後又平移,又縮放。

直接用公式計算,不但複雜,而且效率低下。這時可以借助變換矩陣和矩陣乘法,將多個變換合成乙個。 最後只要用乙個矩陣對每個點做一次處理就可以得到想要的結果。

另外,矩陣乘法一般有硬體支援,比如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個矩陣按變換先後順序依次相乘(矩陣乘法不滿足交換律,因此先後順序一定要講究)。

座標的平移,旋轉,縮放矩陣

1 0 0 0 1 0 dx dy 1 d2 d1 m 設某點與原點連線和x軸夾角為b度,以原點為圓心,逆時針轉過a度 原點與該點連線長度為r,x,y 為變換前座標,x,y 為變換後坐標。x rcos b y rsin b x rcos a b rcosacosb rsinasinb xcosa y...

變換(旋轉 縮放 平移)

scale 縮放 rotate 旋轉 shear 裁切 為什麼 是什麼 affifine map 仿射變換 引入齊次座標後的二維變換 復合變換 旋轉 4.1 尤拉角 為什麼 是什麼 4.2 萬向節死鎖 轉動的術語 出現死鎖 這裡桶滾自由度丟失了,只有兩個自由度,無法表示需要三個自由度的旋轉,產生了死...

iOS開發 旋轉 縮放 平移

一 建立乙個uiview import viewcontroller.h inte ce viewcontroller property nonatomic,strong uiview myview end implementation viewcontroller void viewdidload...