计算机图形学数学之矩阵运算(加减乘除、矩阵的平移、旋转、缩放、滤波等)shader实现

矩阵的加、减法

两个矩阵必须规模相同
[ 1 2 3 4 5 6 ] + [ 1 2 3 4 5 6 ] = [ 1 + 1 2 + 2 3 + 3 4 + 4 5 + 5 6 + 6 ] = [ 2 4 6 8 10 12 ] \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} 135246+135246=1+13+35+52+24+46+6=26104812

矩阵的直加

两个不同规模的矩阵可以直加,组合后的矩阵空位用0补位
[ 1 2 3 4 ] ⨁ [ 1 2 3 4 5 6 ] = [ 1 2 0 0 3 4 0 0 0 0 1 2 0 0 3 4 0 0 5 6 ] \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} [1324]135246=13000240000013500246

矩阵的乘除法

几何意义:A x B = 结合两种操作的操作集合。
1、当矩阵A的列数(column)等于矩阵B的行数(row)时,A与B可以相乘。
2、矩阵C的行数等于矩阵A的行数,C的列数等于B的列数。
3、乘积C的第m行第n列的元素等于矩阵A的第m行的元素与矩阵B的第n列对应元素乘积之和
A = [ a 1 a 2 a 3 a 4 a 5 a 6 ] B = [ b 1 b 2 b 3 b 4 b 5 b 6 ] A = \begin{bmatrix}a1&a2&a3\\a4&a5&a6\end{bmatrix}B = \begin{bmatrix}b1&b2\\b3&b4\\b5&b6\end{bmatrix} A=[a1a4a2a5a3a6]B=b1b3b5b2b4b6
C = A B = [ a 1 b 1 + a 2 b 3 + a 3 b 5 a 1 b 2 + a 2 b 4 + a 3 b 6 a 4 b 1 + a 5 b 3 + a 6 b 5 a 4 b 2 + a 5 b 4 + a 6 b 6 ] C=AB=\begin{bmatrix}a1b1+a2b3+a3b5&a1b2+a2b4+a3b6\\a4b1+a5b3+a6b5&a4b2+a5b4+a6b6\end{bmatrix} C=AB=[a1b1+a2b3+a3b5a4b1+a5b3+a6b5a1b2+a2b4+a3b6a4b2+a5b4+a6b6]

矩阵的平移

设 x , y 为 原 坐 标 , d x 、 d y 为 x y 坐 标 的 移 动 量 , 则 x 1 、 y 1 为 变 换 后 的 新 坐 标 设x,y为原坐标,dx、dy为xy坐标的移动量,则x1、y1为变换后的新坐标 xy,dxdyxyx1y1【公式】
( x 1 y 1 ) = ( d x d y ) + ( x y ) \dbinom{x_{1}}{y_{1}}=\dbinom{dx}{dy}+\dbinom{x}{y} (y1x1)=(dydx)+(yx)
【代码的实现】

//shader中的写法
//新x1坐标 = 原x坐标*cos(角度值) - 原y坐标*sin(角度值),角度值的取值区间是pi = 3.14, 相当于180度。该公式其实就是已知两直角边与夹角求第三遍长
x1 = x + dx;
y1 = y + dy;
空间矩阵的旋转
二维空间

设 x , y 为 原 坐 标 , θ 为 旋 转 角 度 , 则 x 1 、 y 1 为 变 换 后 的 新 坐 标 设x,y为原坐标,\theta为旋转角度,则x1、y1为变换后的新坐标 xy,θx1y1【公式】
( x 1 y 1 ) = ( c o s θ − s i n θ s i n θ c o s θ ) × ( x y ) \dbinom{x_{1}}{y_{1}}=\begin{pmatrix}cos\theta&-sin\theta\\sin\theta& cos\theta\end{pmatrix}\times\dbinom{x}{y} (y1x1)=(cosθsinθsinθcosθ)×(yx)
【代码的实现】

//shader中的写法
//新x1坐标 = 原x坐标*cos(角度值) - 原y坐标*sin(角度值),角度值的取值区间是pi = 3.14, 相当于180度。该公式其实就是已知两直角边与夹角求第三遍长
x1 = x * cos(angle) - y * sin(angle);
y1 = x * sin(angle) + y * cos(angle);
三维空间

设 x , y 为 原 坐 标 , θ 为 旋 转 角 度 , 则 x 1 、 y 1 为 变 换 后 的 新 坐 标 设x,y为原坐标,\theta为旋转角度,则x1、y1为变换后的新坐标 xy,θx1y1【公式】
( x 1 y 1 ) = ( c o s θ − s i n θ s i n θ c o s θ ) × ( x y ) \dbinom{x_{1}}{y_{1}}=\begin{pmatrix}cos\theta&-sin\theta\\sin\theta& cos\theta\end{pmatrix}\times\dbinom{x}{y} (y1x1)=(cosθsinθsinθcosθ)×(yx)
【代码的实现】

//shader中的写法
//新x1坐标 = 原x坐标*cos(角度值) - 原y坐标*sin(角度值),角度值的取值区间是pi = 3.14, 相当于180度。该公式其实就是已知两直角边与夹角求第三遍长
x1 = x * cos(angle) - y * sin(angle);
y1 = x * sin(angle) + y * cos(angle);
矩阵的缩放

设 x , y 为 原 坐 标 , S x 、 S y 为 缩 放 倍 数 , 则 x 1 、 y 1 为 变 换 后 的 新 坐 标 设x,y为原坐标,S_{x}、S_{y}为缩放倍数,则x1、y1为变换后的新坐标 xy,SxSyx1y1【公式】
( x 1 y 1 ) = ( S x 0 0 S y ) × ( x y ) \dbinom{x_{1}}{y_{1}}=\begin{pmatrix}S_{x}&0\\0& S_{y}\end{pmatrix}\times\dbinom{x}{y} (y1x1)=(Sx00Sy)×(yx)
【代码的实现】

//shader中的写法
x1 = x * size_x + y * 0;
y1 = x * 0 + y * size_y;
矩阵的切变

设 x , y 为 原 坐 标 , K 为 切 变 系 数 , 则 x 1 、 y 1 为 变 换 后 的 新 坐 标 。 设x,y为原坐标,K为切变系数,则x1、y1为变换后的新坐标。 xy,Kx1y1【公式】
第一种,x方向切变:
( x 1 y 1 ) = ( 1 k 0 1 ) × ( x y ) \dbinom{x_{1}}{y_{1}}=\begin{pmatrix}1&k\\0&1\end{pmatrix}\times\dbinom{x}{y} (y1x1)=(10k1)×(yx)
第二种,y方向切变:
( x 1 y 1 ) = ( 1 0 k 1 ) × ( x y ) \dbinom{x_{1}}{y_{1}}=\begin{pmatrix}1&0\\k&1\end{pmatrix}\times\dbinom{x}{y} (y1x1)=(1k01)×(yx)
【代码的实现】

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

设 x , y 为 原 坐 标 , u x , u y 为 直 线 方 向 的 单 位 向 量 , 则 x 1 、 y 1 为 变 换 后 的 新 坐 标 设x,y为原坐标,ux,uy为直线方向的单位向量,则x1、y1为变换后的新坐标 xy,ux,uy线x1y1【公式】
( x 1 y 1 ) = ( 2 u x 2 − 1 2 u x u y 2 u x u y 2 u y 2 − 1 ) × ( x y ) \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} (y1x1)=(2ux212uxuy2uxuy2uy21)×(yx)
【代码的实现】

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

设 x , y 为 原 坐 标 , u x , u y 为 直 线 方 向 的 单 位 向 量 , 则 x 1 、 y 1 为 变 换 后 的 新 坐 标 设x,y为原坐标,ux,uy为直线方向的单位向量,则x1、y1为变换后的新坐标 xy,ux,uy线x1y1【公式】
( x 1 y 1 ) = ( u x 2 u x u y u x u y u y 2 ) × ( x y ) \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} (y1x1)=(ux2uxuyuxuyuy2)×(yx)
【代码的实现】

//shader中的写法
x1 = x * pow(ux,2) + y * ux * uy;
y1 = x * ux * uy + y * pow(uy, 2);
矩阵的线性变换
矩阵的滤波
图像处理算法部分
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千年奇葩

从来没受过打赏,这玩意好吃吗?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值