欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解Android Matrix理論與使用的詳解

 更新時(shí)間:2013年05月20日 17:14:19   作者:  
本篇文章是對(duì)Android Matrix理論與使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下

以前在線性代數(shù)中學(xué)習(xí)了矩陣,對(duì)矩陣的基本運(yùn)算有一些了解,前段時(shí)間在使用GDI+的時(shí)候再次學(xué)習(xí)如何使用矩陣來(lái)變化圖像,看了之后在這里總結(jié)說(shuō)明。
首先大家看看下面這個(gè)3 x 3的矩陣,這個(gè)矩陣被分割成4部分。為什么分割成4部分,在后面詳細(xì)說(shuō)明。

首先給大家舉個(gè)簡(jiǎn)單的例子:現(xiàn)設(shè)點(diǎn)P0(x0, y0)進(jìn)行平移后,移到P(x,y),其中x方向的平移量為△x,y方向的平移量為△y,那么,點(diǎn)P(x,y)的坐標(biāo)為:
x = x0  + △x 
y = y0  + △y
采用矩陣表達(dá)上述如下: 
clip_image002

上述也類(lèi)似與圖像的平移,通過(guò)上述矩陣我們發(fā)現(xiàn),只需要修改矩陣右上角的2個(gè)元素就可以了。
我們回頭看上述矩陣的劃分: 
clip_image003

為了驗(yàn)證上面的功能劃分,我們舉個(gè)具體的例子:現(xiàn)設(shè)點(diǎn)P0(x0 ,y0)進(jìn)行平移后,移到P(x,y),其中x放大a倍,y放大b倍,

矩陣就是:clip_image004,按照類(lèi)似前面“平移”的方法就驗(yàn)證。

圖像的旋轉(zhuǎn)稍微復(fù)雜:現(xiàn)設(shè)點(diǎn)P0(x0, y0)旋轉(zhuǎn)θ角后的對(duì)應(yīng)點(diǎn)為P(x, y)。通過(guò)使用向量,我們得到如下:
x0 = r cosα 
y0 = r sinα
x = r cos(α+θ) = x0 cosθ - y0 sinθ 
y = r sin(α+θ) = x0 sinθ + y0 cosθ

于是我們得到矩陣:clip_image005

如果圖像圍繞著某個(gè)點(diǎn)(a ,b)旋轉(zhuǎn)呢?則先要將坐標(biāo)平移到該點(diǎn),再進(jìn)行旋轉(zhuǎn),然后將旋轉(zhuǎn)后的圖像平移回到原來(lái)的坐標(biāo)原點(diǎn),在后面的篇幅中我們將詳細(xì)介紹。

Matrix學(xué)習(xí)——如何使用Matrix

本篇幅我們就結(jié)合Android 中的android.graphics.Matrix來(lái)具體說(shuō)明,還記得我們前面說(shuō)的圖像旋轉(zhuǎn)的矩陣:

clip_image005[1]

從最簡(jiǎn)單的旋轉(zhuǎn)90度的是:

clip_image006

在android.graphics.Matrix中有對(duì)應(yīng)旋轉(zhuǎn)的函數(shù): 
Matrix matrix = new Matrix(); 
matrix.setRotate(90); 
Test.Log(MAXTRIX_TAG,”setRotate(90):%s” , matrix.toString());

clip_image007

查看運(yùn)行后的矩陣的值(通過(guò)Log輸出):

clip_image008

與上面的公式基本完全一樣(android.graphics.Matrix采用的是浮點(diǎn)數(shù),而我們采用的整數(shù))。
有了上面的例子,相信大家就可以親自嘗試了。通過(guò)上面的例子我們也發(fā)現(xiàn),我們也可以直接來(lái)初始化矩陣,比如說(shuō)要旋轉(zhuǎn)30度:

clip_image010

前面給大家介紹了這么多,下面我們開(kāi)始介紹圖像的鏡像,分為2種:水平鏡像、垂直鏡像。先介紹如何實(shí)現(xiàn)垂直鏡像,什么是垂直鏡像就不詳細(xì)說(shuō)明。圖像的垂直鏡像變化也可以用矩陣變化的表示,設(shè)點(diǎn)P0(x0 ,y0 )進(jìn)行鏡像后的對(duì)應(yīng)點(diǎn)為P(x ,y ),圖像的高度為fHeight,寬度為fWidth,原圖像中的P0(x0 ,y0 )經(jīng)過(guò)垂直鏡像后的坐標(biāo)變?yōu)椋▁0 ,fHeight- y0); 
x = x0 
y = fHeight – y0 
推導(dǎo)出相應(yīng)的矩陣是:

clip_image011

final float f[] = {1.0F,0.0F,0.0F,0.0F,-1.0F,120.0F,0.0F,0.0F,1.0F}; 
Matrix matrix = new Matrix(); 
matrix.setValues(f);

按照上述方法運(yùn)行后的結(jié)果: 
clip_image012

至于水平鏡像采用類(lèi)似的方法,大家可以自己去試試吧。
實(shí)際上,使用下面的方式也可以實(shí)現(xiàn)垂直鏡像: 
Matrix matrix = new Matrix(); 
matrix.setScale (1.0,-1.0); 
matrix.postTraslate(0, fHeight);
這就是我們將在后面的篇幅中詳細(xì)說(shuō)明。

Matrix學(xué)習(xí)——圖像的復(fù)合變化

Matrix學(xué)習(xí)——基礎(chǔ)知識(shí)篇幅中,我們留下一個(gè)話題:如果圖像圍繞著某個(gè)點(diǎn)P(a,b)旋轉(zhuǎn),則先要將坐標(biāo)系平移到該點(diǎn),再進(jìn)行旋轉(zhuǎn),然后將旋轉(zhuǎn)后的圖像平移回到原來(lái)的坐標(biāo)原點(diǎn)。

我們需要3步:
1. 平移——將坐標(biāo)系平移到點(diǎn)P(a,b);
2. 旋轉(zhuǎn)——以原點(diǎn)為中心旋轉(zhuǎn)圖像;
3. 平移——將旋轉(zhuǎn)后的圖像平移回到原來(lái)的坐標(biāo)原點(diǎn);
相比較前面說(shuō)的圖像的幾何變化(基本的圖像幾何變化),這里需要平移——旋轉(zhuǎn)——平移,這種需要多種圖像的幾何變化就叫做圖像的復(fù)合變化。
設(shè)對(duì)給定的圖像依次進(jìn)行了基本變化F1、F2、F3…..、Fn,它們的變化矩陣分別為T(mén)1、T2、T3…..、Tn,圖像復(fù)合變化的矩陣T可以表示為:T = TnTn-1…T1。
按照上面的原則,圍繞著某個(gè)點(diǎn)(a,b)旋轉(zhuǎn)θ的變化矩陣序列是:

clip_image013

按照上面的公式,我們列舉一個(gè)簡(jiǎn)單的例子:圍繞(100,100)旋轉(zhuǎn)30度(sin 30 = 0.5 ,cos 30 = 0.866) 
float f[]= { 0.866F,  -0.5F, 63.4F,0.5F, 0.866F,-36.6F,0.0F,    0.0F,  1.0F }; 
matrix = new Matrix(); 
matrix.setValues(f); 
旋轉(zhuǎn)后的圖像如下:

clip_image014

Android為我們提供了更加簡(jiǎn)單的方法,如下: 
Matrix matrix = new Matrix(); 
matrix.setRotate(30,100,100); 
矩陣運(yùn)行后的實(shí)際結(jié)果: 

clip_image015

與我們前面通過(guò)公式獲取得到的矩陣完全一樣。
在這里我們提供另外一種方法,也可以達(dá)到同樣的效果: 
float a = 100.0F,b = 100.0F; 
matrix = new Matrix(); 
matrix.setTranslate(a,b); 
matrix.preRotate(30); 
matrix.preTranslate(-a,-b); 
將在后面的篇幅中為大家詳細(xì)解析
通過(guò)類(lèi)似的方法,我們還可以得到:相對(duì)點(diǎn)P(a,b)的比例[sx,sy]變化矩陣

clip_image016

Matrix學(xué)習(xí)——Preconcats or Postconcats?

從最基本的高等數(shù)學(xué)開(kāi)始,Matrix的基本操作包括:+、*。Matrix的乘法不滿足交換律,也就是說(shuō)A*B ≠B*A。還有2種常見(jiàn)的矩陣:

clip_image017

有了上面的基礎(chǔ),下面我們開(kāi)始進(jìn)入主題。由于矩陣不滿足交換律,所以用矩陣B乘以矩陣A,需要考慮是左乘(B*A),還是右乘(A*B)。在Android的android.graphics.Matrix中為我們提供了類(lèi)似的方法,也就是我們本篇幅要說(shuō)明的Preconcats matrix 與 Postconcats  matrix。下面我們還是通過(guò)具體的例子還說(shuō)明:

clip_image018

通過(guò)輸出的信息,我們分析其運(yùn)行過(guò)程如下:

clip_image019

看了上面的輸出信息。我們得出結(jié)論:Preconcats matrix相當(dāng)于右乘矩陣,Postconcats  matrix相當(dāng)于左乘矩陣。

clip_image020

Matrix學(xué)習(xí)——錯(cuò)切變換

什么是圖像的錯(cuò)切變換(Shear transformation)?我們還是直接看圖片錯(cuò)切變換后是的效果:

clip_image021

clip_image022

對(duì)圖像的錯(cuò)切變換做個(gè)總結(jié):

clip_image023

x = x0 + b*y0;
y = d*x0 + y0;

clip_image024

這里再次給大家介紹一個(gè)需要注意的地方:

clip_image025

通過(guò)以上,我們發(fā)現(xiàn)Matrix的setXXXX()函數(shù),在調(diào)用時(shí)調(diào)用了一次reset(),這個(gè)在復(fù)合變換時(shí)需要注意。

Matrix學(xué)習(xí)——對(duì)稱(chēng)變換(反射)

什么是對(duì)稱(chēng)變換?具體的理論就不詳細(xì)說(shuō)明了,圖像的鏡像就是對(duì)稱(chēng)變換中的一種。

clip_image026

利用上面的總結(jié)做個(gè)具體的例子,產(chǎn)生與直線y= – x對(duì)稱(chēng)的反射圖形,代碼片段如下:

clip_image027

當(dāng)前矩陣輸出是:

clip_image028

圖像變換的效果如下:

clip_image029

附:三角函數(shù)公式
兩角和公式
sin(a+b)=sinacosb+cosasinb
sin(a-b)=sinacosb-sinbcosa 
cos(a+b)=cosacosb-sinasinb
cos(a-b)=cosacosb+sinasinb
tan(a+b)=(tana+tanb)/(1-tanatanb)
tan(a-b)=(tana-tanb)/(1+tanatanb)
cot(a+b)=(cotacotb-1)/(cotb+cota) 
cot(a-b)=(cotacotb+1)/(cotb-cota)
倍角公式
tan2a=2tana/[1-(tana)^2]
cos2a=(cosa)^2-(sina)^2=2(cosa)^2 -1=1-2(sina)^2
sin2a=2sina*cosa
半角公式
sin(a/2)=√((1-cosa)/2) sin(a/2)=-√((1-cosa)/2)
cos(a/2)=√((1+cosa)/2) cos(a/2)=-√((1+cosa)/2)
tan(a/2)=√((1-cosa)/((1+cosa)) tan(a/2)=-√((1-cosa)/((1+cosa))
cot(a/2)=√((1+cosa)/((1-cosa)) cot(a/2)=-√((1+cosa)/((1-cosa)) 
tan(a/2)=(1-cosa)/sina=sina/(1+cosa)
和差化積
2sinacosb=sin(a+b)+sin(a-b)
2cosasinb=sin(a+b)-sin(a-b) )
2cosacosb=cos(a+b)-sin(a-b)
-2sinasinb=cos(a+b)-cos(a-b)
sina+sinb=2sin((a+b)/2)cos((a-b)/2
cosa+cosb=2cos((a+b)/2)sin((a-b)/2)
tana+tanb=sin(a+b)/cosacosb
積化和差公式
sin(a)sin(b)=-1/2*[cos(a+b)-cos(a-b)]
cos(a)cos(b)=1/2*[cos(a+b)+cos(a-b)]
sin(a)cos(b)=1/2*[sin(a+b)+sin(a-b)]
誘導(dǎo)公式
sin(-a)=-sin(a)
cos(-a)=cos(a)
sin(pi/2-a)=cos(a)
cos(pi/2-a)=sin(a)
sin(pi/2+a)=cos(a)
cos(pi/2+a)=-sin(a)
sin(pi-a)=sin(a)
cos(pi-a)=-cos(a)
sin(pi+a)=-sin(a)
cos(pi+a)=-cos(a)
tga=tana=sina/cosa
萬(wàn)能公式
sin(a)= (2tan(a/2))/(1+tan^2(a/2))
cos(a)= (1-tan^2(a/2))/(1+tan^2(a/2))
tan(a)= (2tan(a/2))/(1-tan^2(a/2))
其它公式
a*sin(a)+b*cos(a)=sqrt(a^2+b^2)sin(a+c) [其中,tan(c)=b/a]
a*sin(a)-b*cos(a)=sqrt(a^2+b^2)cos(a-c) [其中,tan(c)=a/b]
1+sin(a)=(sin(a/2)+cos(a/2))^2
1-sin(a)=(sin(a/2)-cos(a/2))^2
其他非重點(diǎn)三角函數(shù)
csc(a)=1/sin(a)
sec(a)=1/cos(a)
雙曲函數(shù)
sinh(a)=(e^a-e^(-a))/2
cosh(a)=(e^a+e^(-a))/2
tgh(a)=sinh(a)/cosh(a)

相關(guān)文章

最新評(píng)論