計算機圖形學數學之矩陣運算(加減乘除、矩陣的平移、旋轉、縮放、濾波等)shader實現

矩陣的加、減法

兩個矩陣必須規模相同
[123456]+[123456]=[1+12+23+34+45+56+6]=[24681012]\begin{bmatrix}1&2\\3&4\\5&6\end{bmatrix}+\begin{bmatrix}1&2\\3&4\\5&6\end{bmatrix}=\begin{bmatrix}1+1&2+2\\3+3&4+4\\5+5&6+6\end{bmatrix}=\begin{bmatrix}2&4\\6&8\\10&12\end{bmatrix}

矩陣的直加

兩個不同規模的矩陣可以直加,組合後的矩陣空位用0補位
[1234][123456]=[12003400001200340056]\begin{bmatrix}1&2\\3&4\end{bmatrix}\bigoplus\begin{bmatrix}1&2\\3&4\\5&6\end{bmatrix}=\begin{bmatrix}1&2&0&0\\3&4&0&0\\0&0&1&2\\0&0&3&4\\0&0&5&6\end{bmatrix}

矩陣的乘除法

幾何意義:A x B = 結合兩種操作的操作集合。
1、當矩陣A的列數(column)等於矩陣B的行數(row)時,A與B可以相乘。
2、矩陣C的行數等於矩陣A的行數,C的列數等於B的列數。
3、乘積C的第m行第n列的元素等於矩陣A的第m行的元素與矩陣B的第n列對應元素乘積之和
A=[a1a2a3a4a5a6]B=[b1b2b3b4b5b6]A = \begin{bmatrix}a1&a2&a3\\a4&a5&a6\end{bmatrix}B = \begin{bmatrix}b1&b2\\b3&b4\\b5&b6\end{bmatrix}
C=AB=[a1b1+a2b3+a3b5a1b2+a2b4+a3b6a4b1+a5b3+a6b5a4b2+a5b4+a6b6]C=AB=\begin{bmatrix}a1b1+a2b3+a3b5&a1b2+a2b4+a3b6\\a4b1+a5b3+a6b5&a4b2+a5b4+a6b6\end{bmatrix}

矩陣的平移

xy,dxdyxyx1y1設x,y爲原座標,dx、dy爲xy座標的移動量,則x1、y1爲變換後的新座標【公式】
(x1y1)=(dxdy)+(xy)\dbinom{x_{1}}{y_{1}}=\dbinom{dx}{dy}+\dbinom{x}{y}
【代碼的實現】

//shader中的寫法
//新x1座標 = 原x座標*cos(角度值) - 原y座標*sin(角度值),角度值的取值區間是pi = 3.14, 相當於180度。該公式其實就是已知兩直角邊與夾角求第三遍長
x1 = x + dx;
y1 = y + dy;
空間矩陣的旋轉
二維空間

xy,θx1y1設x,y爲原座標,\theta爲旋轉角度,則x1、y1爲變換後的新座標【公式】
(x1y1)=(cosθsinθsinθcosθ)×(xy)\dbinom{x_{1}}{y_{1}}=\begin{pmatrix}cos\theta&-sin\theta\\sin\theta& cos\theta\end{pmatrix}\times\dbinom{x}{y}
【代碼的實現】

//shader中的寫法
//新x1座標 = 原x座標*cos(角度值) - 原y座標*sin(角度值),角度值的取值區間是pi = 3.14, 相當於180度。該公式其實就是已知兩直角邊與夾角求第三遍長
x1 = x * cos(angle) - y * sin(angle);
y1 = x * sin(angle) + y * cos(angle);
三維空間

xy,θx1y1設x,y爲原座標,\theta爲旋轉角度,則x1、y1爲變換後的新座標【公式】
(x1y1)=(cosθsinθsinθcosθ)×(xy)\dbinom{x_{1}}{y_{1}}=\begin{pmatrix}cos\theta&-sin\theta\\sin\theta& cos\theta\end{pmatrix}\times\dbinom{x}{y}
【代碼的實現】

//shader中的寫法
//新x1座標 = 原x座標*cos(角度值) - 原y座標*sin(角度值),角度值的取值區間是pi = 3.14, 相當於180度。該公式其實就是已知兩直角邊與夾角求第三遍長
x1 = x * cos(angle) - y * sin(angle);
y1 = x * sin(angle) + y * cos(angle);
矩陣的縮放

xy,SxSyx1y1設x,y爲原座標,S_{x}、S_{y}爲縮放倍數,則x1、y1爲變換後的新座標【公式】
(x1y1)=(Sx00Sy)×(xy)\dbinom{x_{1}}{y_{1}}=\begin{pmatrix}S_{x}&0\\0& S_{y}\end{pmatrix}\times\dbinom{x}{y}
【代碼的實現】

//shader中的寫法
x1 = x * size_x + y * 0;
y1 = x * 0 + y * size_y;
矩陣的切變

xy,Kx1y1設x,y爲原座標,K爲切變係數,則x1、y1爲變換後的新座標。【公式】
第一種,x方向切變:
(x1y1)=(1k01)×(xy)\dbinom{x_{1}}{y_{1}}=\begin{pmatrix}1&k\\0&1\end{pmatrix}\times\dbinom{x}{y}
第二種,y方向切變:
(x1y1)=(10k1)×(xy)\dbinom{x_{1}}{y_{1}}=\begin{pmatrix}1&0\\k&1\end{pmatrix}\times\dbinom{x}{y}
【代碼的實現】

//shader中的寫法
//x方向的切變 
x1 = x * 1 + y * k;
y1 = x * 0 + y * 1
//y方向的切變 
x1 = x * 1 + y * 0;
y1 = x * k + y * 1
矩陣的反射(?)

xy,ux,uyx1y1設x,y爲原座標,ux,uy爲直線方向的單位向量,則x1、y1爲變換後的新座標【公式】
(x1y1)=(2ux212uxuy2uxuy2uy21)×(xy)\dbinom{x_{1}}{y_{1}}=\begin{pmatrix}2u_{x}^2-1&2u_{x}u_{y}\\2u_{x}u_{y}&2u_{y}^2-1\end{pmatrix}\times\dbinom{x}{y}
【代碼的實現】

//shader中的寫法
x1 = x * 2 * pow(ux,2) - 1 + y * 2 * ux * uy;
y1 = x * 2 * ux * uy + y * 2 * pow(uy, 2) - 1;
矩陣的正投影

xy,ux,uyx1y1設x,y爲原座標,ux,uy爲直線方向的單位向量,則x1、y1爲變換後的新座標【公式】
(x1y1)=(ux2uxuyuxuyuy2)×(xy)\dbinom{x_{1}}{y_{1}}=\begin{pmatrix}u_{x}^2&u_{x}u_{y}\\u_{x}u_{y}&u_{y}^2\end{pmatrix}\times\dbinom{x}{y}
【代碼的實現】

//shader中的寫法
x1 = x * pow(ux,2) + y * ux * uy;
y1 = x * ux * uy + y * pow(uy, 2);
矩陣的線性變換
矩陣的濾波
圖像處理算法部分
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章