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