Android Matrix的pre脖旱、post理解

在圖像仿射變換中,我們可以用Matrix來進行圖像的平移介蛉、縮放萌庆、旋轉(zhuǎn)、錯切币旧,對應Android代碼中就是以下接口的復合操作:

set/pre/post Translate(...)
set/pre/post Scale(...)
set/pre/post Rotate(...)
set/pre/post Skew(...)

原理部分很多文章都有介紹践险,這里先簡要的說明下。如下是四種變換對應的控制參數(shù):



矩陣變換的控制參數(shù)

進行圖像變換的時候,可以理解為圖像中每一個二維坐標點的矩陣變換:





上圖對應二維坐標點的平移(Translate)巍虫、縮放(Scale)彭则、旋轉(zhuǎn)(Rotate)變換的矩陣運算表達式,只要左乘對應的矩陣表達式即可占遥。

重點:pre和post的理解

網(wǎng)上有很多文章講的不準確俯抖,只停留在現(xiàn)象和結(jié)果上總結(jié),很容易對讀者造成誤解瓦胎,我也深受其害芬萍。其實從本質(zhì)上理解就不難了。

變換矩陣初始為單位矩陣搔啊,每一次post/pre調(diào)用都是對前一次矩陣的左乘/右乘運算柬祠,最后生成結(jié)果的變換矩陣。

設M為原始矩陣负芋,S為變換矩陣漫蛔,M'為變換后的矩陣,
pre(S)相當于矩陣的右乘:M' = M ? S
post(S)相當于矩陣的左乘:M' = S ? M

我們舉一個復合變換的例子:圖片以中心點旋轉(zhuǎn)90度旧蛾,一般的操作步驟為:

  1. 坐標原點平移到中心點
  2. 以中心點為圓心旋轉(zhuǎn)90度
  3. 將坐標原點平移到原來的位置

其中每一步操作都可以對應一次矩陣的運算莽龟,即左乘對應的變換矩陣。則代碼可表示為

Matrix matrix = new Matrix();// 單位矩陣
matrix.postTranslate(-width/2, -height/2);// 左乘平移變換矩陣锨天,坐標原點平移到中心點
matrix.postRotate(90);// 左乘旋轉(zhuǎn)變換矩陣轧房,旋轉(zhuǎn)90度
matrix.postTranslate(width/2, height/2);// 左乘平移變換矩陣,將坐標原點平移到原來的位置

我們設原始矩陣為M绍绘,平移為T,旋轉(zhuǎn)為R迟赃,單位矩陣為I陪拘,最終結(jié)果為M'。
上述過程用矩陣可表達為:

Matrix matrix = new Matrix();// M' = M = I
matrix.postTranslate(-width/2, -height/2);// M' = T1*I
matrix.postRotate(90);// M' = R*(T1*I)
matrix.postTranslate(width/2, height/2);// M' = T2*(R*(T1*I))

矩陣運算滿足:

  1. 結(jié)合律纤壁,即(AB)C = A(BC)
  2. 和單位矩陣相乘結(jié)果不變左刽,即A*I = A

所以上述運算結(jié)果為M' = T2*(R*(T1*I)) = T2*R*T1。
這個M'是結(jié)果的變換矩陣酌媒,會左乘到點坐標上欠痴,來完成圖像的變換。

在Android中如CanvasdrawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)會指定一個Matrix對象參數(shù)秒咨,就是做這個左乘操作的喇辽。
我們設圖像上的點為P,變換后的點為P'雨席,則P' = M'*P = (T2*R*T1)*P菩咨。因為矩陣點乘滿足結(jié)合律,我們可以按照最接近P的操作先運算,可以寫成P' = (T2*(R*(T1*P))):

  1. P' = T1*P --> 坐標原點平移到中心點
  2. P' = R*(T1*P)*P --> 旋轉(zhuǎn)90度
  3. P' = T2*(R(T1*P)*P) --> 將坐標原點平移到原來的位置

我們可以知道抽米,其實post/pre就是矩陣的左乘/右乘操作特占,無論怎么組合,只要最終的M'一樣云茸,則對圖像的變換過程也是一樣的是目。

可以通過post/pre來修改變換矩陣生成的順序,而不影響最后的變換結(jié)果标捺。

上述的例子我們還可以這么寫:

Matrix matrix = new Matrix();// M' = M = I
matrix.postRotate(90);// M' = R*I
matrix.preTranslate(-width/2, -height/2);// M' = T1*(R*I)
matrix.postTranslate(width/2, height/2);// M' = T2*(T1*(R*I))

因為滿足結(jié)合律和單位矩陣相乘結(jié)果不變懊纳,M' = T2*(T1*(R*I)) = T2*T1*R,和第一種方式生成的M'一樣宜岛。
post/pre改變的只是變換矩陣生成的先后順序长踊,每一步過程都相當于表達式中的小括號,因為滿足結(jié)合律萍倡,表達式可以統(tǒng)一簡化成從右到左的變換過程身弊,這樣就能清楚最終對圖像做的具體變換操作。只要變換矩陣M'一樣列敲,變換結(jié)果就一樣阱佛。

為什么叫post/pre,如何理解戴而?

我們知道post是左乘凑术,pre是右乘,死記可以所意,理解了更好淮逊。pre字面上是previous提前的意思,因為pre操作為右乘更靠近P扶踊,我們按照接近P的操作先運算就相當于"提前"了泄鹏;而post為左乘,越靠近左邊秧耗,越“延后”運算备籽。

參考文章:http://www.gcssloop.com/customview/Matrix_Basic

不難吧,理解了就能靈活運用了分井,如果愛情有這么簡單就好了车猬。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市尺锚,隨后出現(xiàn)的幾起案子珠闰,更是在濱河造成了極大的恐慌,老刑警劉巖瘫辩,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铸磅,死亡現(xiàn)場離奇詭異赡矢,居然都是意外死亡,警方通過查閱死者的電腦和手機阅仔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門吹散,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人八酒,你說我怎么就攤上這事空民。” “怎么了羞迷?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵界轩,是天一觀的道長。 經(jīng)常有香客問我衔瓮,道長浊猾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任热鞍,我火速辦了婚禮葫慎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘薇宠。我一直安慰自己偷办,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布澄港。 她就那樣靜靜地躺著椒涯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪回梧。 梳的紋絲不亂的頭發(fā)上废岂,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音狱意,去河邊找鬼泪喊。 笑死,一個胖子當著我的面吹牛髓涯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播哈扮,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼纬纪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了滑肉?” 一聲冷哼從身側(cè)響起包各,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎靶庙,沒想到半個月后问畅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年护姆,在試婚紗的時候發(fā)現(xiàn)自己被綠了矾端。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡卵皂,死狀恐怖秩铆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情灯变,我是刑警寧澤殴玛,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站添祸,受9級特大地震影響滚粟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜刃泌,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一凡壤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蔬咬,春花似錦鲤遥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至狐援,卻和暖如春钢坦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啥酱。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工爹凹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镶殷。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓禾酱,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绘趋。 傳聞我的和親對象是個殘疾皇子颤陶,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容