歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android中Matrix的pre post set方法理解

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

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

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

平移:

旋轉:

縮放:

有一點要說明:上圖中的原始矩陣為3*1的矩陣,我們可以將其擴展成3*3的矩陣,否則下文涉及到的後乘操作將不成立,甚至在後乘的時候我們可以看成是1*3的矩陣,這不影響實際的變換效果。

之前一直不理解為什麼要設置pre,set和post三種變換操作,我一直認為只通過post操作即可完成所有的變換,後來通過查閱相關資料以及同事的指點,有了一些粗淺的認識,當然現在的認識仍然是模模糊糊,甚至是錯誤的,希望通過博客和大家分享並糾正我可能存在的錯誤。

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得到的是不同的變換效果。

個人覺得以上分析結果很可能存在一些偏差,如哪位大俠發現錯誤還請麻煩指正~~

Copyright © Linux教程網 All Rights Reserved