1. 程式人生 > >android Matrix的pre、post、set三種變形方式

android Matrix的pre、post、set三種變形方式

在Matrix中,pre、post、set都有對應的Rotate、Scale、Translate、Skew函式,每個函式的效果都可以看成是一個3x3矩陣與matrix的乘積。對於同樣的函式f()的pre、post、set

形式,該函式f()可用同一個矩陣A表示,則pref()所做的工作就是matrix=matrix*A,postf()所做的工作就是matrix=A*matrix,setf()所做的工作就matrix=matrix.rest();matrix=matrx*A

現在來分析這三種方式的區別

當matrix為標準矩陣時,這三種方式是沒有區別的,因為標準矩陣與任何矩陣的乘積都等於該矩陣(不管是左乘還是右乘)

matrix改變影象的實質就是作用於影象上一個個的畫素點,現在假設有矩陣A、B、C作用於點(x,y),表示為A*B*C*,其效果為先對點(x,y)進行C變換再進行B變換最後進行A變換。下面用例項來分析pre,post,set的區別

        matrix.postScale(2,3,4,5);
        matrix.preTranslate(4,5);
注意以上程式碼,雖然postScale(2,3,4,5)是寫在前面的,但是先執行的卻是translate(4,5),為什麼會這樣呢?假設postScale(2,3,4,5)用矩陣A表示,preTransLate(4,5)用矩陣B表示,則行以上兩條語句後最後生成的矩陣為A*matrix*B,根據前面所講的理論,其效果為先對點進行B變換再進行matrix(原)變換最後進行A變換
        matrix.postScale(2,3,4,5);
        matrix.preTranslate(4,5);
        matrix.setRotate(30);
        matrix.preScale(2,3);
注意set以前對matrix的作用都是無效的,因為在執行matrix.setf()時執行了matrix.reset(),所以以上程式碼的執行效果為:scale(2,3)——>rotate(30)