個人博客: http://zhangsunyucong.top
開頭
這篇博客奖年,是參考了文章:Android Matrix友题,這篇文章有具體的分析過程和android實(shí)例都办。我只是參考和根據(jù)自己的理解寫的美侦。
在Android中系谐,我們可以從數(shù)學(xué)的角度來看顏色和動畫的變換巾陕。這里會從矩陣變換的角度來理解平移讨跟,旋轉(zhuǎn),縮放鄙煤,對稱的變換晾匠。
這些變換的完成實(shí)際上,是操作一個3X3的矩陣的梯刚。而這四種基本變換與操作和這個矩陣有什么樣的關(guān)系呢凉馆?下面會分析。
在Android中亡资,已經(jīng)為每種變換提供了pre澜共、set和post三種操作方式。
set 用于設(shè)置Matrix中的值锥腻。
pre 是先乘嗦董,因?yàn)榫仃嚨某朔ú粷M足交換律,因此先乘瘦黑、后乘必須要嚴(yán)格區(qū)分京革。先乘相當(dāng)于矩陣運(yùn)算中的右乘。
post 是后乘幸斥,因?yàn)榫仃嚨某朔ú粷M足交換律匹摇,因此先乘、后乘必須要嚴(yán)格區(qū)分甲葬。后乘相當(dāng)于矩陣運(yùn)算中的左乘来惧。
另外,除平移變換(Translate)外演顾,旋轉(zhuǎn)變換(Rotate)、縮放變換(Scale)和錯切變換(Skew)都可以圍繞一個中心點(diǎn)來進(jìn)行隅居,如果不指定钠至,在默認(rèn)情況下是圍繞(0, 0)來進(jìn)行相應(yīng)的變換的。
平移變換
假設(shè)坐標(biāo)系中有A和B兩個點(diǎn)胎源,從A平移到B點(diǎn)棉钧,它們之間的關(guān)系上圖所示。
在x和y軸的移動增量分別是:
則易得:
它的矩陣表示為:
旋轉(zhuǎn)變換
1涕蚤、圍繞坐標(biāo)原點(diǎn)旋轉(zhuǎn)
由A點(diǎn)順時針旋轉(zhuǎn)一定角度到B點(diǎn)宪卿,如圖所示。
由圖易知:
由上面四個式子万栅,可得:
矩陣表示佑钾,得:
旋轉(zhuǎn)變換
2、圍繞某點(diǎn)旋轉(zhuǎn)
假設(shè)旋轉(zhuǎn)點(diǎn)是:
順時針旋轉(zhuǎn)烦粒,結(jié)合1休溶、上面的推導(dǎo)結(jié)果代赁,可以得到矩陣:
可以化為:
可知,圍繞某一點(diǎn)進(jìn)行旋轉(zhuǎn)變換兽掰,可以分成3個步驟芭碍,即首先將坐標(biāo)原點(diǎn)移至該點(diǎn),然后圍繞新的坐標(biāo)原點(diǎn)進(jìn)行旋轉(zhuǎn)變換孽尽,再然后將坐標(biāo)原點(diǎn)移回到原先的坐標(biāo)原點(diǎn)窖壕。
縮放變換
A點(diǎn)的x,y坐標(biāo)分別放大a,b倍杉女。則有一下關(guān)系:
用三維矩陣表示為:
對稱變換
1瞻讽、如果對稱軸是x軸,則有:
用三維矩陣表示為:
2宠纯、如果對稱軸是y軸卸夕,則有:
用三維矩陣表示為:
3、如果對稱軸是y = x軸婆瓜,如圖
由等腰直角三角形可知:
已知中點(diǎn)在對稱軸上快集,由中點(diǎn)坐標(biāo)公式,易得:
聯(lián)合兩式子廉白,2式先乘以2个初,再兩式相加和相減,可得:
用三維矩陣表示為:
4猴蹂、如果對稱軸是y = -x軸院溺。
同理,易推導(dǎo)得:
5磅轻、如果對稱軸是y = kx時珍逸。如圖
由圖易知:
則有:
由直線的斜率公式,可得:
中點(diǎn)坐標(biāo)在直線上聋溜,結(jié)合中點(diǎn)坐標(biāo)公式谆膳,易得:
由上面兩式,可求得:
用三維矩陣表示為:
k為任意實(shí)數(shù)撮躁,可以取特殊的值漱病,驗(yàn)證前面對稱推導(dǎo)的結(jié)果。k為1或者-1時把曼,k為0時杨帽,k為無窮大時等等。
6嗤军、如果對稱軸是y = kx + b時
只需要在5的基礎(chǔ)上增加兩次平移變換即可注盈,即先將坐標(biāo)原點(diǎn)移動到(0, b),然后做上面的關(guān)于y = kx的對稱變換型雳,再然后將坐標(biāo)原點(diǎn)移回到原來的坐標(biāo)原點(diǎn)即可当凡。用矩陣表示大致是這樣的: