android matrix使用和詳細說明

之前在線性代數中學習了矩陣,對矩陣的基本運算有一些瞭解,前段時間在使用GDI+的時候再次學習如何使用矩陣來變化圖像,看了以後在這裏總結說 明。android

首先你們看看下面這個3 x 3的矩陣,這個矩陣被分割成4部分。爲何分割成4部分,在後面詳細說明。函數

3 x 3

首先給你們舉個簡單的例子:現設點P0(x0, y0)進行平移後,移到P(x,y),其中x方向的平移量爲△x,y方向的平移量爲△y,那麼,點P(x,y)的座標爲:post

x = x0  + △x
y = y0  + △y學習

採用矩陣表達上述以下:
Translatespa

上述也相似與圖像的平移,經過上述矩陣咱們發現,只須要修改矩陣右上角的2個元素就能夠了。orm

咱們回頭看上述矩陣的劃分:
Area圖片

爲了驗證上面的功能劃分,咱們舉個具體的例子:現設點P0(x0 ,y0)進行平移後,移到P(x,y),其中x放大a倍,y放大b倍,get

矩陣就是:Scale ,按照相似前面「平移」的方法就驗證。數學

圖像的旋轉稍微複雜:現設點P0(x0, y0)旋轉θ角後的對有點爲P(x, y)。經過使用向量,咱們獲得以下:it

x0 = r  cosα
y0 = r  sinα

x = r cos(α-θ) = x0 cosθ+ y0 sinθ
y = r sia(α-θ) = -x0 sinθ+y0 cosθ

因而咱們獲得矩陣:Rotate

若是圖像圍繞着某個點(a ,b)旋轉呢?則先要將座標平移到該點,再進行旋轉,而後將旋轉後的圖像平移回到原來的座標原點,在後面的篇幅中咱們將詳細介紹。

 

從高等數學方面給你們介紹了Matrix,本篇幅咱們就結合Android 中的android.graphics.Matrix來具體說明,還記得咱們前面說的圖像旋轉的矩陣:

Rotate

從最簡單的旋轉90度的是:

Rotate-90-Matrix

在android.graphics.Matrix中有對應旋轉的函數:
Matrix matrix = new Matrix();
matrix.setRotate(90);
Test.Log(MAXTRIX_TAG,」setRotate(90):%s」 , matrix.toString());

Rotate-90-Android

查看運行後的矩陣的值(經過Log輸出):

Rotate-90-Android-log

與上面的公式基本徹底同樣(android.graphics.Matrix採用的是浮點數,而咱們採用的整數)。

有了上面的例子,相信你們就能夠親自嘗試了。經過上面的例子咱們也發現,咱們也能夠直接來初始化矩陣,好比說要旋轉30度:

Rotate-30-Matrix

前面給你們介紹了這麼多,下面咱們開始介紹圖像的鏡像 ,分爲2種:水平鏡像、垂直鏡像。先介紹如何實現垂直鏡 像,什麼是垂直鏡像就不詳細說明。圖像的垂直鏡像變化也能夠用矩陣變化的表示,設點P0(x0 ,y0 )進行鏡像後的對應點爲P(x ,y ),圖像的高度爲fHeight,寬度爲fWidth,原圖像中的P0(x0 ,y0 )通過垂直鏡像後的座標變爲(x0 ,fHeight- y0);
x = x0
y = fHeight – y0
推導出相應的矩陣是:

垂直鏡像-Matrix

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);

按照上述方法運行後的結果:
垂直鏡像-Android

至於水平鏡像採用相似的方法,你們能夠本身去試試吧。

實際上,使用下面的方式也能夠實現垂直鏡像:
Matrix matrix = new Matrix();
matrix.setScale (1.0,-1.0);
matrix.postTraslate(0, fHeight);

這就是咱們將在後面的篇幅中詳細說明。

什麼是對稱變換?具體的理論就不詳細說明了,圖像的鏡像就是對稱變換中的一種。

Symmetry

利用上面的總結作個具體的例子,產生與直線y= – x對稱的反射圖形,代碼片斷以下:

Symmetry-Example

當前矩陣輸出是:

Symmetry-Matrix-Output

圖像變換的效果以下:

Symmetry-Android

 

什麼是圖像的錯切變換 (Shear transformation)?咱們仍是直接看圖片錯切變換後是的效果:

Shear-Transformation

Shear-Matrix-Result

對圖像的錯切變換作個總結:

Shear-Matrix

x = x0 + b*y0;

y = d*x0 + y0;

Shear-Table

這裏再次給你們介紹一個須要注意的地方:

pre-set

經過以上,咱們發現Matrix的setXXXX()函數,在調用時調用了一次reset(),這個在複合變換時須要注意。

 

Preconcats matrix or  Postconcats matrix?

從最基本的高等數學開始,Matrix的基本操做包括:+、*。Matrix的乘法不知足交換律,也就是說A*B ≠B*A。

還有2種常見的矩陣:

Identity-Inverse

有了上面的基礎,下面咱們開始進入主題。因爲矩陣不知足交換律,因此用矩陣B乘以矩陣A,須要考慮是左乘(B*A),還 是右乘(A*B)。在Android的android.graphics.Matrix中爲咱們提供了相似的方法,也就是咱們本篇幅要說明的 Preconcats matrix 與 Postconcats  matrix。下面咱們仍是經過具體的例子還說明:

Preconcats-Postconcats-Example

經過輸出的信息,咱們分析其運行過程以下:

Preconcats-Postconcats-Matrix

看了上面的輸出信息。咱們得出結論:Preconcats matrix至關於右乘矩陣,Postconcats  matrix 相 當於 左乘矩陣 。

上一篇副中,咱們說到:

equal

其運行過程的詳細分析就不在這裏多說了。

 

咱們留下一個話題:若是圖像圍繞着某個點P(a,b)旋轉,則先要將座標系平移到該點,再進行旋轉,而後將旋轉後的圖像平移回到原來的座標原點。

咱們須要3步:

  1. 平移 ——將座標系平移到點P(a,b);
  2. 旋轉 ——以原點爲中心旋轉圖像;
  3. 平移 ——將旋轉後的圖像平移回到原來的座標原點;

相比較前面說的圖像的幾何變化(基本的圖像幾何變化),這裏須要平移——旋轉——平移 ,這種須要多種圖像的幾何 變化就叫作圖像的複合變化 。

設對給定的圖像依次進行了基本變化F一、F二、F3…..、Fn,它們的變化矩陣分別爲T一、T二、T3…..、Tn,圖像複合變 化的矩陣T能夠表示爲:T = TnTn-1…T1。

按照上面的原則,圍繞着某個點(a,b)旋轉θ的變化矩陣序列是:

Composite Change Matrix

按照上面的公式,咱們列舉一個簡單的例子:圍繞(100,100)旋轉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);
旋轉後的圖像以下:

Rotate-100-100-Android

Android爲咱們提供了更加簡單的方法,以下:
Matrix matrix = new Matrix ();
matrix.setRotate (30,100,100);
矩陣運行後的實際結果:
Rotate-30-100-100-Matrix 
與咱們前面經過公式獲取獲得的矩陣徹底同樣。

在這裏咱們提供另一種方法,也能夠達到一樣的效果:
float a = 100.0F,b = 100.0F;
matrix = new Matrix ();
matrix.setTranslate (a,b);
matrix.preRotate (30);
matrix.preTranslate (-a,-b);
將在後面的篇幅中爲你們詳細解析

經過相似的方法,咱們還能夠獲得:相對點P(a,b)的比例[sx,sy]變化矩陣

P(a,b)-Scale

相關文章
相關標籤/搜索