这一章介绍三个动画指令:drawnowpauserotate,并用一些例子来感受一下动画制作的思路。

(13.1) drawnow

drawnow指令可以暂停程序的执行,并刷新图形窗口。可以利用这一功能与xdataydatazdata等图形数据属性的修改,实现图形的动画效果。先来看个简单的例子:

clc;clear;clf;
x = 0:0.1:2*pi;
y = sin(x);
h = plot(x,y); %画初始位置曲线
xlim([0,4*pi]);
deltaX = 0.01; %定义相邻两帧画面中曲线在x方向上的距离
while(1) %这是一个死循环,会让曲线向右运动的画面一直播放
    x = x + deltaX;
    set(h,'xdata',x);
    drawnow;
end

在这里插入图片描述

例:利用drawnow指令制作一个小圆面做圆周运动的动画(小圆面的半径为0.5,圆周轨迹的半径为10)。

clc;clear;clf;
t = 0:0.05:2*pi;
%画出小圆的运动轨迹
X = 10*cos(t);
Y = 10*sin(t);
H = plot(X,Y,'r--');
axis([-15,15,-15,15]);
axis equal;
hold on;
%画出小圆的初始位置
x = 0.5*cos(t) + 10;
y = 0.5*sin(t) + 0;
h = fill(x,y,'g');
deltaTheta = pi/180; %1°为间隔运动
while(1)
    x = 0.5*cos(t) + 10*cos(deltaTheta);
    y = 0.5*sin(t) + 10*sin(deltaTheta);
    set(h,'xdata',x,'ydata',y);
    drawnow;
    deltaTheta = deltaTheta + pi/180;
end

在这里插入图片描述

(13.2) pause

drawnow函数一样的道理,还可以利用pause指令与xdataydatazdata等图形数据属性的修改,实现图形的动画效果。

例:利用pause指令制作一个圆面半径从10逐渐减小到1的动画。

clc;clear;clf;
t = 0:0.05:2*pi;
x = 10*cos(t);
y = 10*sin(t);
h = fill(x,y,'b');
axis([-15,15,-15,15]);
axis equal;
hold on;
deltaR = 0.25;
while(deltaR <= 9)
    x = (10 - deltaR) * cos(t);
    y = (10 - deltaR) * sin(t);
    set(h,'xdata',x,'ydata',y);
    pause(0.1);
    deltaR = deltaR + 0.25;
end

在这里插入图片描述

例:利用pause指令设计一个模拟小方块沿水平板向右移动的动画。

clc;clear;clf;
%画出平板
flatX = [0,10,10,0];
flatY = [0,0,0.1,0.1];
flatH = fill(flatX,flatY,'g');
set(gca,'position',[0.1,0.5,0.8,0.16]); %将坐标轴设置在图形窗口的[0.1,0.5]位置处,长0.8,宽0.16
axis equal;
hold on;
%画出小方块的初始位置
blockX = [0,0.5,0.5,0];
blockY = [0.1,0.1,0.6,0.6];
blockH = fill(blockX,blockY,'r');
deltaX = 0.25; 
while(blockX(2) < flatX(2)) %开始运动
    blockX = blockX + deltaX;
    set(blockH,'xdata',blockX);
    pause(0.1);
end

在这里插入图片描述

(13.3) rotate

rotate(h,direction,alpha) %h是图形对象的句柄,direction是一个二元或三元向量,代表的是从图形坐标轴原点到该点的向量,alpha是图形旋转的角度

例:利用rotate指令制作一个模拟钟表时针转动的动画。

clc;clear;clf;
hold on;
axis equal;
axis([-8,8,-8,8]);
%画出时钟的12个刻度
clockScaleT = linspace(0,(2*pi-pi/6),12);
clockScaleX = 6*cos(clockScaleT);
clockScaleY = 6*sin(clockScaleT);
plot(clockScaleX,clockScaleY,'rp');
%画出时钟的边框
clockEdgeT = 0:0.01:2*pi;
clockEdgeX1 = (6 + 0.3)*cos(clockEdgeT);
clockEdgeY1 = (6 + 0.3)*sin(clockEdgeT);
clockEdgeX2 = (6 + 0.3 + 0.2)*cos(clockEdgeT);
clockEdgeY2 = (6 + 0.3 + 0.2)*sin(clockEdgeT);
plot(clockEdgeX1,clockEdgeY1,'k',clockEdgeX2,clockEdgeY2,'k');
%画出秒针的初始位置
secondHandX = [0,0];
secondHandY = [0,4];
secondHandH = plot(secondHandX,secondHandY,'b','linewidth',2);
while(1)
    rotate(secondHandH,[0,0,1],-6);
    pause(1);
end

在这里插入图片描述


《 M A T L A B   S Y N T A X 》 系 列 博 客 创 作 参 考 资 料 来 源 《MATLAB\ SYNTAX》系列博客创作参考资料来源 MATLAB SYNTAX

  1. 《自动控制原理实验教程》.巨林仓.西安交通大学出版社.
  2. 《MATLAB工程与科学绘图》.周博.薛世峰.清华大学出版社.
  3. 《MATLAB R2018a完全自学一本通》.刘浩.韩晶.电子工业出版社.
  4. 《科学计算与MATLAB语言》.刘卫国.蔡旭晖.吕格莉.何小贤.中国大学MOOC.
  5. 《MATLAB软件与基础数学实验》.李换琴.朱旭.王勇茂.籍万新.西安交通大学出版社.
  6. 《Matlab教程 - 图像处理》@正月点灯笼.https://www.bilibili.com.
  7. 《MATLAB从入门到秃头》@古德谓尔.https://www.bilibili.com.

博 客 创 作 : A i d e n   L e e 博客创作:Aiden\ Lee Aiden Lee
特别声明:文章仅供学习参考,转载请注明出处,严禁盗用!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐