前面我已經大概的介紹了一下matrix矩陣,下面我們來看一下
***scale(),***skew(),***translate(),***rotate()
的計算過程:
對於乙個座標為(x
0,y0
) 的點,我希望把他變成(k
x0,k
y0) ,那麼我們可以給它乘上乙個矩陣: ⎡⎣
⎢⎢k0
00k0
001⎤
⎦⎥⎥∗
⎡⎣⎢⎢
⎢x0y
01⎤⎦
⎥⎥⎥=
⎡⎣⎢⎢
⎢kx0
ky01
⎤⎦⎥⎥
⎥ 這樣,我們就把這個點成功的進行了變換。
那麼矩陣是如何對進行變換的呢?
其實很簡單,它只不過是對的每個畫素點進行了變換,組成的所有畫素點都變了,那麼自然也就變了。
這樣說的話,那縮放變換感覺很詭異啊,乙個畫素點還能變大變小嗎?
的縮放原理相對複雜一些,但其實它就是按照一定的演算法,對進行下取樣(縮小)、上取樣(放大)來對進行變換的。
所謂下取樣,就是按照一定的規律,在原圖的所有畫素點中,擷取符合規律的畫素點(這意味著一些畫素點會被丟棄掉),然後將這些畫素點呈現出來,我們就可以看到一張縮小了得。
所謂上取樣,就是按照一定的演算法,在原的額畫素群中插入一些畫素點,然後再把這些畫素點呈現出來,就得到一張放大的。
當然這個複雜的計算過程不需要我們自己去實現,我們只需要告訴系統,我要一張多大的,系統就會幫助我們完成這個過程,然後直接給我們一張處理好的。
前面我們已經知道了scale變換是由msacle_x,和mscale_y控制的,那麼自然的,***scale()
就是通過修改這兩個值到達變換矩陣目的。
注:下面的講解都基於乙個標準矩陣 a 來進行。呼叫s
etsc
ale(
k1,k
2),則是直接把a矩陣設定為: ⎡⎣
⎢⎢k1
000k
2000
1⎤⎦⎥
⎥ 再次說明,呼叫set***()
是直接設定矩陣的值,不管你此前對矩陣做了什麼操作,它都會被這個矩陣給覆蓋掉。呼叫p
resc
ale(
k1,k
2),則是經過如下計算: ⎡⎣
⎢⎢k1
000k
2000
1⎤⎦⎥
⎥∗⎡⎣
⎢⎢10
0010
001⎤
⎦⎥⎥=
⎡⎣⎢⎢
k100
0k20
001⎤
⎦⎥⎥
post
scal
e(k1
,k2)
是後乘,它的計算過程如下: ⎡⎣
⎢⎢10
0010
001⎤
⎦⎥⎥∗
⎡⎣⎢⎢
k100
0k20
001⎤
⎦⎥⎥=
⎡⎣⎢⎢
k100
0k20
001⎤
⎦⎥⎥
呼叫set
skew
(k1,
k2) ,直接將a設定成:⎡⎣
⎢⎢1k
20k1
1000
1⎤⎦⎥
⎥ 呼叫p
resk
ew(k
1,k2
) 的計算過程如下: ⎡⎣
⎢⎢1k
20k1
1000
1⎤⎦⎥
⎥∗⎡⎣
⎢⎢10
0010
001⎤
⎦⎥⎥=
⎡⎣⎢⎢
1k20
k110
001⎤
⎦⎥⎥
呼叫pos
tske
w(k1
,k2)
的計算過程如下: ⎡⎣
⎢⎢10
0010
001⎤
⎦⎥⎥∗
⎡⎣⎢⎢
1k20
k110
001⎤
⎦⎥⎥=
⎡⎣⎢⎢
1k20
k110
001⎤
⎦⎥⎥
呼叫set
tran
slat
e() 是將矩陣直接設定為: ⎡⎣
⎢⎢10
0010
k1k2
1⎤⎦⎥
⎥ pretranslate()和posttranslate()的計算原理和上述的一樣的。
呼叫setrotate(a)
會直接把矩陣設定為: ⎡⎣
⎢⎢co
s(a)
sin(
a)0−
sin(
a)co
s(a)
0001
⎤⎦⎥⎥
prerotate()和postrotate()的計算過程就不在贅述了。
Android Matrix變換矩陣的探索 1
標準矩陣又稱為對角矩陣,它的形式如下 1,0,0 0,1,0 0,0,1 矩陣的簡單運算規則 左矩陣的一行的每個值,分別按順序一一對應的乘上右矩陣的一列的值。也就是說,運算的左右兩個矩陣必須符合左矩陣的列數要等於右矩陣的行數,否則兩個矩陣就不能進行運算。下面給出兩個例子 例1 例2可以看出,由於矩陣...
Android Matrix類的使用
在android中,對的處理需要使用到matrix類,matrix是乙個3 x 3的矩陣,他對的處理分為四個基本型別 1 translate 平移變換 2 scale 縮放變換 3 rotate 旋轉變換 4 skew 錯切變換 在android的api裡對於每一種變換都提供了三種操作方式 set ...
android Matrix工具的使用
matrix工具類是對圖形進行特效處理。matrix 是乙個矩陣工具類,本身不能對圖形進行變換,可以與其他api來結合使用。獲取matrix物件,可以直接建立,可以從其他封裝了matrix類中獲取,transformation裡面就封裝了matrix物件。呼叫matrix物件的方法可以對圖形影象進行...