这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战
1 引言
图形变换和观察是计算机图形学的基础内容之一,也是图形显示过程中不可缺少的一个环节
许多复杂的图形,其实可以由简单图形通过平移、旋转、缩放、镜像、投影等操作,再加以组合得到
本文将讨论二维图形各种变换,以及将变换结果组合为复杂的图形
2 思路
所有的变换功能,如平移、旋转、缩放等,均可集成在一个函数中,调用时只需改变函数的参数即可,而不需重复实现
二维图形变换主要思想为——矩阵运算,且采用右乘法为主
- 将组成原图形的点坐标化为齐次形式
- 平移变换矩阵为[100010TxTy1]\begin{bmatrix}1&0&0\0&1&0\T_x&T_y&1\end{bmatrix}⎣⎡10Tx01Ty001⎦⎤
- 缩放变换矩阵为[Sx000Sy0001]\begin{bmatrix}S_x&0&0\0&S_y&0\0&0&1\end{bmatrix}⎣⎡Sx000Sy0001⎦⎤
- 旋转变换矩阵为[cosθsinθ0−sinθcosθ0001]\begin{bmatrix}cos\theta&sin\theta&0\-sin\theta&cos\theta&0\0&0&1\end{bmatrix}⎣⎡cosθ−sinθ0sinθcosθ0001⎦⎤
Tips:
若原始图形变换基准点不在原点,需先将其平移至原点,进行相应变换后,再逆变换平移回到原始位置
这样完成所需功能,则需要多个矩阵变换矩阵相乘,即级联变换
3 过程
3.1 函数
函数调用格式为xuanzhuan(x,y,a,k,tx,ty,sx,sy)
- 其中x,y为图形坐标
- a为旋转角度(角度制)
- k为模式:1为直线,2为圆或椭圆
- tx,ty为平移参数
- sx,sy为缩放参数
首先初始化
1 | matlab复制代码[~,n]=size(x); |
再分别根据直线,或者圆和椭圆的情况进行变换
1 | matlab复制代码%直线的情况 |
最后将新、旧图形一并绘出,便于进行对比
1 | matlab复制代码%绘制新旧图形 |
3.2 变换过程
- 首先在直线、圆、椭圆绘制的基础上,得到其基本图形的x,y坐标
- 对一条直线进行旋转操作,再对新旧两条直线进行平移
- 对绘制的椭圆进行旋转和对称操作,使之拥有优美的对称形式
- 对圆进行缩放操作,压缩后的圆变成了椭圆,与圆叠加形成一种“行星”效果
完整代码请见GraphTransform(gitee.com)
4 结果
图形组合效果如下:
本文转载自: 掘金