Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android Matrix的用法總結

Android Matrix的用法總結

編輯:關於Android編程

簡介

Matrix ,中文裡叫矩陣,高等數學裡有介紹。Android中的Matrix類是一個3x3的位置坐標矩陣,在圖像處理方面,主要是用於平面的縮放、平移、旋轉等操作。

Matrix的數學原理

首先了解下這個3 x 3的矩陣,其內容如下所示:
這裡寫圖片描述

Matrix的對圖像的處理可分為四類基本變換:

英文 中文 Translate 平移變換 Rotate 旋轉變換 Scale 縮放變換 Skew 錯切變換


從字面上理解,矩陣中的MSCALE用於處理縮放變換,MSKEW用於處理錯切變換,MTRANS用於處理平移變換,MPERSP用於處理透視變換。實際中當然不能完全按照字面上的說法去理解Matrix。同時,在Android的文檔中,未見到用Matrix進行透視變換的相關說明,所以本文也不討論這方面的問題。

針對每種變換,Android提供了pre、set和post三種操作方式。其中:

set用於設置Matrix中的值。 pre是先乘,因為矩陣的乘法不滿足交換律,因此先乘、後乘必須要嚴格區分。先乘相當於矩陣運算中的右乘。 post是後乘,因為矩陣的乘法不滿足交換律,因此先乘、後乘必須要嚴格區分。後乘相當於矩陣運算中的左乘。

除平移變換(Translate)外,旋轉變換(Rotate)、縮放變換(Scale)和錯切變換(Skew)都可以圍繞一個中心點來進行,如果不指定,在默認情況下是圍繞(0, 0)來進行相應的變換的。

下面我們來看看四種變換的具體情形。由於所有的圖形都是有點組成,因此我們只需要考察一個點相關變換即可。

平移變換

假定有一個點的坐標是 P(x0,y0),將其移動到 P(x,y) ,再假定在x軸和y軸方向移動的大小分別為:

△x = x?x0
△y = y?y0

如下圖所示:

這裡寫圖片描述

不難知道:

x=x0 + △x
y=y0 + △y

如果用矩陣來表示的話,就可以寫成:

這裡寫圖片描述

旋轉變換

圍繞坐標原點旋轉

假定有一個點的坐標是 P(x0,y0),相對坐標原點順時針旋轉θ後的情形,同時假定P點離坐標原點的距離為r,如下圖:

這裡寫圖片描述

那麼,

這裡寫圖片描述

如果用矩陣,就可以表示為:<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20161006/20161006103139557.jpg" title="\" />

圍繞某個點旋轉

如果是圍繞某個點 (xp,yp)順時針旋轉θ ,那麼用矩陣表示為:

這裡寫圖片描述

可以化為:

這裡寫圖片描述

很顯然:

如下圖所示,是將坐標原點移動到點 (xp,yp) 後, P(x0,y0)的新坐標。

這裡寫圖片描述

如下圖所示,是將上一步變換後的 P(x0,y0),圍繞新的坐標原點順時針旋轉θ

這裡寫圖片描述

如下圖所示,是經過上一步旋轉變換後,再將坐標原點移回到原來的坐標原點。

這裡寫圖片描述

所以,圍繞某一點進行旋轉變換,可以分成3個步驟,即首先將坐標原點移至該點,然後圍繞新的坐標原點進行旋轉變換,再然後將坐標原點移回到原先的坐標原點。

縮放變換

理論上而言,一個點是不存在什麼縮放變換的,但考慮到所有圖像都是由點組成,因此,如果圖像在x軸和y軸方向分別放大k1和k2倍的話,那麼圖像中的所有點的x坐標和y坐標均會分別放大k1和k2倍,即:

x=k1x0
y=k2y0

用矩陣表示就是:

這裡寫圖片描述

縮放變換比較好理解,就不多說了。

錯切變換

錯切變換(skew)在數學上又稱為Shear mapping(可譯為“剪切變換”)或者Transvection(縮並),它是一種比較特殊的線性變換。錯切變換的效果就是讓所有點的x坐標(或者y坐標)保持不變,而對應的y坐標(或者x坐標)則按比例發生平移,且平移的大小和該點到x軸(或y軸)的垂直距離成正比。錯切變換,屬於等面積變換,即一個形狀在錯切變換的前後,其面積是相等的。

比如下圖,各點的y坐標保持不變,但其x坐標則按比例發生了平移。這種情況將水平錯切。

這裡寫圖片描述

下圖各點的x坐標保持不變,但其y坐標則按比例發生了平移。這種情況叫垂直錯切。

這裡寫圖片描述

假定一個點P(x0,y0)經過錯切變換後得到P(x,y),對於水平錯切而言,應該有如下關系:

x=x0 + ky0
y=y0

用矩陣表示就是:

這裡寫圖片描述

擴展到3 x 3的矩陣就是下面這樣的形式:

這裡寫圖片描述

同理,對於垂直錯切,可以有:

這裡寫圖片描述

在數學上嚴格的錯切變換就是上面這樣的。在Android中除了有上面說到的情況外,還可以同時進行水平、垂直錯切,那麼形式上就是:

這裡寫圖片描述

對稱變換

除了上面講到的4中基本變換外,事實上,我們還可以利用Matrix,進行對稱變換。所謂對稱變換,就是經過變化後的圖像和原圖像是關於某個對稱軸是對稱的。比如,某點 經過對稱變換後得到,

如果對稱軸是x軸,難麼,

x=x0
y=?y0

用矩陣表示就是:

這裡寫圖片描述

如果對稱軸是y軸,那麼,

x=?x0
y=y0

用矩陣表示就是:

這裡寫圖片描述

如果對稱軸是y = x,如圖:

這裡寫圖片描述

那麼,

這裡寫圖片描述

很容易可以解得:

x=x0
y=y0

用矩陣表示就是:

這裡寫圖片描述

同樣的道理,如果對稱軸是y = -x,那麼用矩陣表示就是:

這裡寫圖片描述

特殊地,如果對稱軸是y = kx,如下圖:

這裡寫圖片描述

那麼,

這裡寫圖片描述

很容易可解得:

這裡寫圖片描述

用矩陣表示就是:

這裡寫圖片描述

當k = 0時,即y = 0,也就是對稱軸為x軸的情況;當k趨於無窮大時,即x = 0,也就是對稱軸為y軸的情況;當k =1時,即y = x,也就是對稱軸為y = x的情況;當k = -1時,即y = -x,也就是對稱軸為y = -x的情況。不難驗證,這和我們前面說到的4中具體情況是相吻合的。

如果對稱軸是y = kx + b這樣的情況,只需要在上面的基礎上增加兩次平移變換即可,即先將坐標原點移動到(0, b),然後做上面的關於y = kx的對稱變換,再然後將坐標原點移回到原來的坐標原點即可。用矩陣表示大致是這樣的:

這裡寫圖片描述

需要特別注意:在實際編程中,我們知道屏幕的y坐標的正向和數學中y坐標的正向剛好是相反的,所以在數學上y = x和屏幕上的y = -x才是真正的同一個東西,反之亦然。也就是說,如果要使圖片在屏幕上看起來像按照數學意義上y = x對稱,那麼需使用這種轉換:

這裡寫圖片描述

要使圖片在屏幕上看起來像按照數學意義上y = -x對稱,那麼需使用這種轉換:

這裡寫圖片描述

關於對稱軸為y = kx 或y = kx + b的情況,同樣需要考慮這方面的問題。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved