使用Matlab的绘图函数不断重复绘制图形对象,重绘过程中递增式地改变图形对象位置将产生动画效果。在重绘对象的过程中之所以能产生动画效果是由于对原来的图形对象进行了擦除处理。
擦除模式是通过设置“EraseMode”属性来完成的,一共有三种擦除模式:
none:重新绘制图形对象时不擦除原来的对象,这种模式可动态演示图形的生成过程,如曲线和旋转曲砸的生成过程。
background:在重新绘制图形对象之前。用背景色重绘对象来达到擦除原来图形对象的目的。该模式会擦除任何对象和它下面的任何图形。
xor:在重新绘制图形对象之前,只擦除原来的对象,不会擦除其他对象或图形。这种模式能产生图形对象移动的效果。
擦除动画经典格式:
%% 擦除重绘模式动画
%文件夹名字
filename = '名字.gif';
%创建图形窗口并设置属性
hFigure=figure('menubar','none','NumberTitle','off','position',[100 100 500 400],'name','团子','color',b0);
movegui(hFigure,'center');%居中
%创建坐标轴,用于显示背景图片和文本
hAxes=axes('visible','off','units','normalized','position',[0 0 1 1]);
%图形计算命令
h=plot()
%选择一个擦除模式
set(h,'erasemode',erasemode) %h是需要执行动画图像的句柄,一般都是由line或者plot创建
%循环语句中更新坐标数据,一般使用for或者while
for i=1:n
%必要的MATLAB命令
set(h,'xdata',xdata,'ydta',ydata) %更新图像的坐标数据
%其它Matlab语句
axis equal
axis off %关闭坐标轴显示
drownnow %刷新屏幕
pause(0.3)
%下面语句是将静态图像的每一帧进行叠加存储,并写入到filename文件夹中
f=getframe(gcf);
imind=frame2im(f);
[imind,cm] = rgb2ind(imind,256);
if k==1
imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',1.5);
else
imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.3);
end
end
长草颜团子动图:
附上代码:
filename = '团子.gif';
b0=[0.69,0.88,0.9];
g0=[0.19608,0.80392,0.19608];%设置草的颜色
% 创建图形窗口并设置属性
hFigure=figure('menubar','none','NumberTitle','off','position',...
[100 100 500 400],'name','团子','color',b0);
movegui(hFigure,'center');%居中
%创建坐标轴,用于显示背景图片和文本
hAxes=axes('visible','off','units','normalized','position',[0 0 1 1]);
%% 地
plot([-40 170],[-20 -20],'k','linewidth',4);
%% 草
hold on
theta=9*pi/10:0.1:10.8*pi/10;
x=19+20*cos(theta);
y=23+20*sin(theta);
h=plot(x,y,'k','linewidth',3);
theta=0:0.01:2*pi;%180度到360度的圆弧
xL1=-4+4*cos(theta);
yL1=29+3*sin(theta);
hL1=plot(xL1,yL1,'k','linewidth',3,'EraseMode','xor');
hL11=fill(xL1,yL1,g0);
theta=0:0.01:2*pi;%180度到360度的圆弧
xR1=4+4*cos(theta);
yR1=28+3*sin(theta);
hR1=plot(xR1,yR1,'k','linewidth',3,'EraseMode','xor');
hR11=fill(xR1,yR1,g0);
%% 头
theta=0:0.01:2*pi;%180度到360度的圆弧
x1=20*cos(theta);
y1=19*sin(theta);
h1=plot(x1,y1,'k','linewidth',6,'EraseMode','xor');
h11=fill(x1,y1,'w');
%% 眼睛
theta=0:0.01:2*pi;%180度到360度的圆弧
xL2=-8+2.5*cos(theta);
yL2=4+2.5*sin(theta);
hL2=plot(xL2,yL2,'k','EraseMode','xor');
hL22=fill(xL2,yL2,'k');
theta=0:0.01:2*pi;%180度到360度的圆弧
xR2=8+2.5*cos(theta);
yR2=4+2.5*sin(theta);
hR2=plot(xR2,yR2,'k','EraseMode','xor');
hR22=fill(xR2,yR2,'k');
%% 嘴
theta=-12*pi/10:0.1:0.5*pi/10;
xL3=-2+2*cos(theta);
yL3=2*sin(theta);
hL3=plot(xL3,yL3,'k','linewidth',3);
theta=-9.5*pi/10:0.1:2*pi/10;
xR3=2+2*cos(theta);
yR3=2*sin(theta);
hR3=plot(xR3,yR3,'k','linewidth',3);
%% 爱心
t=linspace(-3,3,50);
x4=138+16*(sin(t)).^3;
y4=-3+13*cos(t)-5*cos(2*t)-2*cos(3*t)-cos(4*t);
plot(x4,y4,'k','linewidth',5);%画爱心
fill(x4,y4,'r');
axis equal
for k=1:15
if k==1
set(h,'xdata',x,'ydata',y);
set(h1,'xdata',x1,'ydata',y1);
set(h11,'xdata',x1,'ydata',y1);
set(hL1,'xdata',xL1,'ydata',yL1);
set(hL11,'xdata',xL1,'ydata',yL1);
set(hR1,'xdata',xR1,'ydata',yR1);
set(hR11,'xdata',xR1,'ydata',yR1);
set(hL2,'xdata',xL2,'ydata',yL2);
set(hL22,'xdata',xL2,'ydata',yL2);
set(hR2,'xdata',xR2,'ydata',yR2);
set(hR22,'xdata',xR2,'ydata',yR2);
set(hL3,'xdata',xL3,'ydata',yL3);
set(hR3,'xdata',xR3,'ydata',yR3);
end
if k==2
set(h,'xdata',x+15,'ydata',y+40);
set(h1,'xdata',x1+15,'ydata',y1+40);
set(h11,'xdata',x1+15,'ydata',y1+40);
set(hL1,'xdata',xL1+15,'ydata',yL1+40);
set(hL11,'xdata',xL1+15,'ydata',yL1+40);
set(hR1,'xdata',xR1+15,'ydata',yR1+40);
set(hR11,'xdata',xR1+15,'ydata',yR1+40);
set(hL2,'xdata',xL2+15,'ydata',yL2+40);
set(hL22,'xdata',xL2+15,'ydata',yL2+40);
set(hR2,'xdata',xR2+15,'ydata',yR2+40);
set(hR22,'xdata',xR2+15,'ydata',yR2+40);
set(hL3,'xdata',xL3+15,'ydata',yL3+40);
set(hR3,'xdata',xR3+15,'ydata',yR3+40);
end
if k==3
set(h,'xdata',x+30,'ydata',y);
set(h1,'xdata',x1+30,'ydata',y1);
set(h11,'xdata',x1+30,'ydata',y1);
set(hL1,'xdata',xL1+30,'ydata',yL1);
set(hL11,'xdata',xL1+30,'ydata',yL1);
set(hR1,'xdata',xR1+30,'ydata',yR1);
set(hR11,'xdata',xR1+30,'ydata',yR1);
set(hL2,'xdata',xL2+30,'ydata',yL2);
set(hL22,'xdata',xL2+30,'ydata',yL2);
set(hR2,'xdata',xR2+30,'ydata',yR2);
set(hR22,'xdata',xR2+30,'ydata',yR2);
set(hL3,'xdata',xL3+30,'ydata',yL3);
set(hR3,'xdata',xR3+30,'ydata',yR3);
end
if k==4
set(h,'xdata',x+45,'ydata',y+40);
set(h1,'xdata',x1+45,'ydata',y1+40);
set(h11,'xdata',x1+45,'ydata',y1+40);
set(hL1,'xdata',xL1+45,'ydata',yL1+40);
set(hL11,'xdata',xL1+45,'ydata',yL1+40);
set(hR1,'xdata',xR1+45,'ydata',yR1+40);
set(hR11,'xdata',xR1+45,'ydata',yR1+40);
set(hL2,'xdata',xL2+45,'ydata',yL2+40);
set(hL22,'xdata',xL2+45,'ydata',yL2+40);
set(hR2,'xdata',xR2+45,'ydata',yR2+40);
set(hR22,'xdata',xR2+45,'ydata',yR2+40);
set(hL3,'xdata',xL3+45,'ydata',yL3+40);
set(hR3,'xdata',xR3+45,'ydata',yR3+40);
end
if k==5
set(h,'xdata',x+60,'ydata',y);
set(h1,'xdata',x1+60,'ydata',y1);
set(h11,'xdata',x1+60,'ydata',y1);
set(hL1,'xdata',xL1+60,'ydata',yL1);
set(hL11,'xdata',xL1+60,'ydata',yL1);
set(hR1,'xdata',xR1+60,'ydata',yR1);
set(hR11,'xdata',xR1+60,'ydata',yR1);
set(hL2,'xdata',xL2+60,'ydata',yL2);
set(hL22,'xdata',xL2+60,'ydata',yL2);
set(hR2,'xdata',xR2+60,'ydata',yR2);
set(hR22,'xdata',xR2+60,'ydata',yR2);
set(hL3,'xdata',xL3+60,'ydata',yL3);
set(hR3,'xdata',xR3+60,'ydata',yR3);
end
if k==6
set(h,'xdata',x+80,'ydata',y+40);
set(h1,'xdata',x1+80,'ydata',y1+40);
set(h11,'xdata',x1+80,'ydata',y1+40);
set(hL1,'xdata',xL1+80,'ydata',yL1+40);
set(hL11,'xdata',xL1+80,'ydata',yL1+40);
set(hR1,'xdata',xR1+80,'ydata',yR1+40);
set(hR11,'xdata',xR1+80,'ydata',yR1+40);
set(hL2,'xdata',xL2+80,'ydata',yL2+40);
set(hL22,'xdata',xL2+80,'ydata',yL2+40);
set(hR2,'xdata',xR2+80,'ydata',yR2+40);
set(hR22,'xdata',xR2+80,'ydata',yR2+40);
set(hL3,'xdata',xL3+80,'ydata',yL3+40);
set(hR3,'xdata',xR3+80,'ydata',yR3+40);
end
if k==7
set(h,'xdata',x+100,'ydata',y);
set(h1,'xdata',x1+100,'ydata',y1);
set(h11,'xdata',x1+100,'ydata',y1);
set(hL1,'xdata',xL1+100,'ydata',yL1);
set(hL11,'xdata',xL1+100,'ydata',yL1);
set(hR1,'xdata',xR1+100,'ydata',yR1);
set(hR11,'xdata',xR1+100,'ydata',yR1);
set(hL2,'xdata',xL2+100,'ydata',yL2);
set(hL22,'xdata',xL2+100,'ydata',yL2);
set(hR2,'xdata',xR2+100,'ydata',yR2);
set(hR22,'xdata',xR2+100,'ydata',yR2);
set(hL3,'xdata',xL3+100,'ydata',yL3);
set(hR3,'xdata',xR3+100,'ydata',yR3);
end
axis equal
axis off;%关闭坐标轴显示
axis([-40 170 -30 90]);
drawnow; % 刷新屏幕
pause(0.3)
%下面语句是将静态图像的每一帧进行叠加存储,并写入到filename文件夹中
f = getframe(gcf);
imind = frame2im(f);
[imind,cm] = rgb2ind(imind,256);
if k == 1
imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',1.5);
else
imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.3);
end
end