Matrix原理(筆記)

1.Matrix簡介:

Matrix是一個(gè)矩陣,主要功能是坐標(biāo)映射,數(shù)值轉(zhuǎn)換


矩陣.png

Matrix在View,圖片,動(dòng)畫效果等各個(gè)方面均有運(yùn)用。畫布操作是對(duì)Matrix的封裝,Matrix作為更接近底層的東西,必然要比畫布操作更加靈活。

使用上,理解它主要理解矩陣的前乘,后乘。

2.Matrix基本原理

矩陣的作用根本上是坐標(biāo)變換,基本變換有4種: 平移(translate)、縮放(scale)、旋轉(zhuǎn)(rotate) 和 錯(cuò)切(skew)。


矩陣1.jpg

矩陣2.jpg

上面說明了矩陣中參數(shù)的作用。

2.1 縮放(Scale)

x = k1 * x0;
y = k2 * y0;


縮放.png

2.2 錯(cuò)切(Skew)

復(fù)合錯(cuò)切:

x = x0 + k1y0;
y = y0 + k2x0;


復(fù)合錯(cuò)切.png

2.3 旋轉(zhuǎn)(Rotate)

假定一個(gè)點(diǎn) A(x0, y0) ,距離原點(diǎn)距離為 r, 與水平軸夾角為 α 度, 繞原點(diǎn)旋轉(zhuǎn) θ 度, 旋轉(zhuǎn)后為點(diǎn) B(x, y) 如下:

x0 = r * cosa;
y0 = r * sina;

x = r * cos(a + θ) = r * (cosa * cosθ - sina * sinθ) = x0 *cosθ - y0 * sinθ;

y = r * sin(a + θ) = r * (sina * cosθ + cosa * sinθ) = y0 * cosθ + x0 * sinθ;


旋轉(zhuǎn).png

2.4 平移(Translate)

x = x0 + △x;
y = y0 + △xy


平移.png

3.Matrix復(fù)合原理

上面說了坐標(biāo)基本變換,現(xiàn)在重點(diǎn)來了,該如何復(fù)合使用。

Matrix有三類坐標(biāo)設(shè)置方法:,前乘(pre),后乘(post)和設(shè)置(set)。

  • 前乘(pre):前乘相當(dāng)于矩陣的右乘。M' = M * S;
  • 后乘(post):后乘相當(dāng)于矩陣的左乘。M' = S * M;
  • 設(shè)置(set):設(shè)置使用的不是矩陣乘法,而是直接覆蓋掉原來的數(shù)值,所以,使用設(shè)置可能會(huì)導(dǎo)致之前的操作失效。

使用:

由于矩陣乘法不滿足交換律,所以前乘(pre),后乘(post)的區(qū)別還是很大的。

正確使用方式就是先構(gòu)造正常的 Matrix 乘法順序,之后根據(jù)情況使用 pre 和 post 來把這個(gè)順序?qū)崿F(xiàn)。

在構(gòu)造 Matrix 時(shí),個(gè)人建議盡量使用一種乘法,前乘或者后乘,這樣操作順序容易確定,出現(xiàn)問題也比較容易排查。當(dāng)然,由于矩陣乘法不滿足交換律,前乘和后乘的結(jié)果是不同的,使用時(shí)應(yīng)結(jié)合具體情景分析使用。

  1. 由于矩陣乘法不滿足交換律,請(qǐng)保證使用初始矩陣(Initial Matrix),否則可能導(dǎo)致運(yùn)算結(jié)果不同。
  2. 注意構(gòu)造順序,順序是會(huì)影響結(jié)果的。
  3. Initial Matrix是指new出來的新矩陣,或者reset后的矩陣,是一個(gè)單位矩陣。
3.1 僅用pre:
// 使用pre, M' = M*T*S = T*S
Matrix m = new Matrix();
m.reset();
m.preTranslate(tx, ty); 
m.preScale(sx, sy);
pre.png
3.2 僅用post:
// 使用post, M‘ = T*S*M = T*S
Matrix m = new Matrix();
m.reset();
m.postScale(sx, sy);  //,越靠前越先執(zhí)行。
m.postTranslate(tx, ty);
post.png
3.3 混合:
// 混合 M‘ = T*M*S = T*S
Matrix m = new Matrix();
m.reset();
m.preScale(sx, sy);  
m.postTranslate(tx, ty);

// 混合 M‘ = T*M*S = T*S
Matrix m = new Matrix();
m.reset();
m.postTranslate(tx, ty);
m.preScale(sx, sy); 

上面兩種方式最終形式都是T*S,先后順序沒有變


復(fù)合.png

4 參考

安卓自定義View進(jìn)階-Matrix原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容