计算机图形学数学之矩阵运算(加减乘除、矩阵的平移、旋转、缩放、滤波等)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,uy线x1y1设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,uy线x1y1设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);
矩阵的线性变换
矩阵的滤波
图像处理算法部分
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章