【计算机图形学】图形变换+复杂图形组合——MATLAB实现

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

1 引言

图形变换和观察是计算机图形学的基础内容之一,也是图形显示过程中不可缺少的一个环节

许多复杂的图形,其实可以由简单图形通过平移、旋转、缩放、镜像、投影等操作,再加以组合得到

本文将讨论二维图形各种变换,以及将变换结果组合为复杂的图形

2 思路

所有的变换功能,如平移、旋转、缩放等,均可集成在一个函数中,调用时只需改变函数的参数即可,而不需重复实现

二维图形变换主要思想为——矩阵运算,且采用右乘法为主

  • 将组成原图形的点坐标化为齐次形式

  • 平移变换矩阵为 [ 1 0 0 0 1 0 T x T y 1 ] \begin{bmatrix}1&0&0\\0&1&0\\T_x&T_y&1\end{bmatrix}

  • 缩放变换矩阵为 [ S x 0 0 0 S y 0 0 0 1 ] \begin{bmatrix}S_x&0&0\\0&S_y&0\\0&0&1\end{bmatrix}

  • 旋转变换矩阵为 [ c o s θ s i n θ 0 s i n θ c o s θ 0 0 0 1 ] \begin{bmatrix}cos\theta&sin\theta&0\\-sin\theta&cos\theta&0\\0&0&1\end{bmatrix}

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 变换过程

  1. 首先在直线、圆、椭圆绘制的基础上,得到其基本图形的x,y坐标
  2. 对一条直线进行旋转操作,再对新旧两条直线进行平移
  3. 对绘制的椭圆进行旋转和对称操作,使之拥有优美的对称形式
  4. 对圆进行缩放操作,压缩后的圆变成了椭圆,与圆叠加形成一种“行星”效果

完整代码请见GraphTransform(gitee.com)

4 结果

图形组合效果如下:

猜你喜欢

转载自juejin.im/post/7035241715594166280