如果我们在绘制图形之后将原有的图形擦除,并重新绘制,看上去就像动画了
示例:
t = 0;
m = [sin(t);cos(t)];
p = plot(t,m,'EraseMode','background','MarkerSize',5);
x = -1.5*pi;
axis([x x+2*pi -1.5 1.5]);
grid on
for i = 1:100
t = [t 0.1*i];
m = [m [sin(0.1*i);cos(0.1*i)]];
set(p(1),'XData',t,'YData',m(1,:));
set(p(2),'XData',t,'YData',m(2,:));
drawnow
x = x+0.1;
axis([x x+2*pi -1.5 1.5]);
pause(0.2);
end
可以看出:
图形不断重新绘制,每次绘制时横坐标x增加,坐标轴的范围同步变化,视觉上就像是不断向前平移。
这里
%p = plot(t,m,'EraseMode','background','MarkerSize',5);
不再是绘制二维曲线,而是得到曲线句柄(可以理解为标记这条曲线)
同时,我们设置曲线的擦除格式EraseMode为background,方便后续擦除
这里,介绍一下曲线的擦除格式:
有三种:
none:重新绘制图形对象时不擦除原有的对象,可以演示图形的生成,效果类似于我们上一篇中介绍的质子动画
background:也就是我们在这次使用的模式,在重新绘制时会擦除原有的对象。需要注意的是,擦除的不只是曲线句柄指向原有的对象,也包括它下面的任何图形
xor:擦除且仅擦除原有的对象本身
在:
%set(p(2),'XData',t,'YData',m(2,:));
语句,我们设置更新曲线数据,也就是擦除并重画的命令。
注意,在新的MATLAB版本中,运行上述代码会出现以下提示:
警告: EraseMode 属性不再受支持,而且在以后的版本中会出错。
也就是说,这个绘图方式不是现在鼓励使用的了,想要达到同样的效果我们可以使用这个函数代替:
% addpoints();
函数能够向 an 指定的动画线条中添加 x 和 y 定义的点。
使用 animatedline 函数创建一根动画线条。
要在屏幕上显示更新,请使用 drawnow 或 drawnow limitrate。
新点会自动连接到之前的点。
使用格式:
% addpoints(an,x,y)
% addpoints(an,x,y,z)
搭配使用的为animatedline函数:创建一根没有任何数据的动画线条并将其添加到当前坐标区中。通过使用addpoints 函数循环向线条中添加点来创建动画。
使用格式:
%an = animatedline
%an = animatedline(x,y)
%an = animatedline(x,y,z)
举个例子:
clear;
close all
h = animatedline;
axis([0,4*pi,-1,1])
x = linspace(0,4*pi,100);
y = sin(x);
for k = 1:length(x)
addpoints(h,x(k),y(k));
drawnow
end
查询线条中的点。
[xdata,ydata] = getpoints(h);
清除线条中的点。
clearpoints(h)
drawnow
输出的动画如下:
演示视频
参考《高等光学仿真——光波导、激光》