Android中Matrix的pre post set方法理解(轉載來源:Linux社區 做者:zjmdp)

雖然說之前學習過線性代數和圖形學原理,可是在實際中碰到matrix仍是疑惑了好一陣子,今天經過向同事請教終於找到一點門路,特總結以下:linux

Matrix主要用於對平面進行縮放,平移,旋轉以及傾斜操做,爲簡化矩陣變換,Android封裝了一系列方法來進行矩陣變換,其中包括pre系列方法:preScale,preTranslate,preRotate,preSkew,set系列方法:setScale,setTranslate,setRotate,setSkew,post系列方法:postScale,postTranslate,postRotate,postSkew。post

經過將變換矩陣與原始矩陣相乘來達到變換的目的,例如:學習

平移:spa

旋轉:get

縮放:博客

有一點要說明:上圖中的原始矩陣爲3*1的矩陣,咱們能夠將其擴展成3*3的矩陣,不然下文涉及到的後乘操做將不成立,甚至在後乘的時候咱們能夠當作是1*3的矩陣,這不影響實際的變換效果。it

以前一直不理解爲何要設置pre,set和post三種變換操做,我一直認爲只經過post操做便可完成全部的變換,後來經過查閱相關資料以及同事的指點,有了一些粗淺的認識,固然如今的認識仍然是模模糊糊,甚至是錯誤的,但願經過博客和你們分享並糾正我可能存在的錯誤。class

pre方法表示矩陣前乘,例如:變換矩陣爲A,原始矩陣爲B,pre方法的含義便是A*B原理

post方法表示矩陣後乘,例如:變換矩陣爲A,原始矩陣爲B,post方法的含義便是B*A擴展

  1. matrix.preScale(0.5f, 1);   
  2. matrix.preTranslate(100);  
  3. matrix.postScale(0.7f, 1);    
  4. matrix.postTranslate(150);  

等價於:

translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)

注意:後調用的pre操做先執行,然後調用的post操做則後執行。

set方法一旦調用即會清空以前matrix中的全部變換,例如:

  1. matrix.preScale(0.5f, 1);   
  2. matrix.setScale(10.6f);   
  3. matrix.postScale(0.7f, 1);   
  4. matrix.preTranslate(150);  

等價於

translate(15, 0) -> scale(1, 0.6f) ->  scale(0.7f, 1)

matrix.preScale (0.5f, 1)將不起做用。

如下爲我的理解,不保證必定正確:

若是經過getMatrix()獲得的matrix是一個未通過任何變換的單元矩陣,或者是以前已經調用過setMatrix的matrix,那麼咱們能夠僅使用post系列方法或者pre系列方法的其中一種來完成各類變換操做,由於此時咱們僅使用pre或者post方法來定義各類變換次序。

可是若是咱們獲得的matrix是一個非單元矩陣,而且該matrix還未調用setMatrix應用到實際中,此時咱們可能同時須要pre和post方法來實現咱們所須要的變換,例如C是經過getMatrix獲得的並知足以前描述的matrix,此時若是我想在現有的變換以前進行某些變換,此時只有pre方法能夠作到,假如C是一個執行過postScale操做的matrix,此時我想在postScale以前進行平移,那只有調用preTranslate,這樣當調用setMatrix的時候會先進行preTranslate操做,再進行postScale操做。必須這麼作的前提就是先scale後translate和先translate後scale獲得的是不一樣的變換效果。

我的以爲以上分析結果極可能存在一些誤差,如哪位大俠發現錯誤還請麻煩指正~~

相關文章
相關標籤/搜索