转自http://blog.sciencenet.cn/blog-412191-598966.html
制作PPT时经常需要使用一些动画,尤其是将程序的运行结果动态地表现出来,下面提供三种方法。
1.使用comet、comet3函数
comet与comet3函数其实反映的是运动轨迹图,comet3是三维图形。
example for comet:
clear all
clc
theta=0:2*pi/100:2*pi;
r=10;
x=r*cos(theta);
y=r*sin(theta);
comet(x,y)
clc
theta=0:2*pi/100:2*pi;
r=10;
x=r*cos(theta);
y=r*sin(theta);
comet(x,y)
example for comet3:
clear all
clc
t=-10*pi:pi/250:10*pi;
comet3((cos(2*t).^2).*sin(t),(sin(2*t).^2).*cos(t),t);
clc
t=-10*pi:pi/250:10*pi;
comet3((cos(2*t).^2).*sin(t),(sin(2*t).^2).*cos(t),t);
2.使用drawnow命令
example for drawnow:
clear all
clc
x=0:pi/50:2*pi;
y=sin(x);
plot(x,y)
h=line(0,0,'color','r','marker','.','markersize',40);
axesValue=axis;
for jj=1:length(x)
set(h,'xdata',x(jj),'ydata',y(jj));
axis(axesValue);
drawnow
pause(0.1)
end
clc
x=0:pi/50:2*pi;
y=sin(x);
plot(x,y)
h=line(0,0,'color','r','marker','.','markersize',40);
axesValue=axis;
for jj=1:length(x)
set(h,'xdata',x(jj),'ydata',y(jj));
axis(axesValue);
drawnow
pause(0.1)
end
3.使用movie函数
严格来讲,movie函数才是真正地制作动画,他其实是将每幀图片保存下来,然后再进行播放。
example for movie:
clear all
clc
clear all
clc
x=0:pi/50:2*pi;
y=sin(x);
plot(x,y)
h=line(0,0,'color','r','marker','.','markersize',40);
axesValue=axis;
A(1:length(x))=struct('cdata',[],'colormap',[]);
clc
clear all
clc
x=0:pi/50:2*pi;
y=sin(x);
plot(x,y)
h=line(0,0,'color','r','marker','.','markersize',40);
axesValue=axis;
A(1:length(x))=struct('cdata',[],'colormap',[]);
for jj=1:length(x)
set(h,'xdata',x(jj),'ydata',y(jj));
axis(axesValue);
drawnow
A(jj)=getframe;
end
movie(A,1)
set(h,'xdata',x(jj),'ydata',y(jj));
axis(axesValue);
drawnow
A(jj)=getframe;
end
movie(A,1)
这样产生的动画只能在matlab中播放,为了生成能够在PPT中支持的格式,我们可将他转换为avi。
clear all
clc
clear all
clc
x=0:pi/50:2*pi;
y=sin(x);
plot(x,y)
h=line(0,0,'color','r','marker','.','markersize',40);
axesValue=axis;
A(1:length(x))=struct('cdata',[],'colormap',[]);
clc
clear all
clc
x=0:pi/50:2*pi;
y=sin(x);
plot(x,y)
h=line(0,0,'color','r','marker','.','markersize',40);
axesValue=axis;
A(1:length(x))=struct('cdata',[],'colormap',[]);
for jj=1:length(x)
set(h,'xdata',x(jj),'ydata',y(jj));
axis(axesValue);
drawnow
A(jj)=getframe;
end
movie2avi(A,'ex_movie2avi','compression','none')
set(h,'xdata',x(jj),'ydata',y(jj));
axis(axesValue);
drawnow
A(jj)=getframe;
end
movie2avi(A,'ex_movie2avi','compression','none')
以上生成的avi格式视频是没有经过压缩的,往往比较大,可根据实际需要选取合适的压缩方法。
4.产生gif格式的图片
以上三种方法都有局限性,即使是第三种转换为avi格式,在放映PPT时如果播放avi格式,会弹出警告,为了避免这种问题,最好使用图片格式插入,而目前最常见的动画图片格式就是gif,为此下面介绍如果利用matlab来生成gif格式的图片。
example:
clear all
clc
clear all
clc
x=0:pi/50:2*pi;
y=sin(x);
plot(x,y)
h=line(0,0,'color','r','marker','.','markersize',40);
axesValue=axis;
A(1:length(x))=struct('cdata',[],'colormap',[]);
for jj=1:length(x)
set(h,'xdata',x(jj),'ydata',y(jj));
axis(axesValue);
clc
clear all
clc
x=0:pi/50:2*pi;
y=sin(x);
plot(x,y)
h=line(0,0,'color','r','marker','.','markersize',40);
axesValue=axis;
A(1:length(x))=struct('cdata',[],'colormap',[]);
for jj=1:length(x)
set(h,'xdata',x(jj),'ydata',y(jj));
axis(axesValue);
drawnow
f=getframe;
f=frame2im(f);
[X,map]=rgb2ind(f,256);
if mod(jj,10)==1
if jj==1
imwrite(X,map,'ex_imwrite.gif');
else
imwrite(X,map,'ex_imwrite.gif','WriteMode','Append');
end
end
end
f=getframe;
f=frame2im(f);
[X,map]=rgb2ind(f,256);
if mod(jj,10)==1
if jj==1
imwrite(X,map,'ex_imwrite.gif');
else
imwrite(X,map,'ex_imwrite.gif','WriteMode','Append');
end
end
end
主要上面对imwrite的使用,只有将'WriteMode'设置为'Append'才可以制作为动画。
参考文献
1.matlab的help文档
2.《matlab N个实用技巧》