第一种形式:
作gif动画要用到getframe、frame2im、rgb2ind和imwrite函数,getframe函数用来抓取当前图形窗口中的图像,frame2im函数和rgb2ind函数用来将抓取的图像转为索引图像,imwrite函数用来将索引图像写入gif格式动画,需要注意的是imwrite函数不能将真彩图像写入gif格式动画。关于这些函数的具体用法,这里不再详述,请版友自行查阅帮助。下面只给出案例。 【例1】绕螺旋线运动的小球
效果图:
- filename = 'xiezhh.gif';
- z = linspace(0, 10*pi, 100); %产生一个行向量
- x = [20*sin(z),zeros(1,10)];
- y = [20*cos(z),20*ones(1,10)];
- z = [z,linspace(10*pi,0,10)];
- plot3(x, y, z, 'r', 'linewidth', 2); %绘制螺旋线
- hold on %图形保持
- h = plot3(0,20,0, '.' , 'MarkerSize' ,40, 'EraseMode' , 'xor' );
- xlabel('X'); ylabel('Y'); zlabel('Z'); %添加坐标轴标签
- axis([-25 25 -25 25 0 40]); %设置坐标轴范围
- view(-210,30); %设置视角
-
- for i = 1:length(x)
- set(h, 'xdata' ,x(i), 'ydata' ,y(i), 'zdata' ,z(i));
- drawnow; % 刷新屏幕
- pause(0.05)
- f = getframe(gcf);
- imind = frame2im(f);
- [imind,cm] = rgb2ind(imind,256);
- if i == 1
- imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
- else
- imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
- end
- end
|
|
|
第二种形式:
利用moviein和movie函数,现将生成的动画存入一个由movien
函数定义的数组中,每一帧为数组的一个元素,最后用movie重复演示,movie后面的数字代表演示次数。
x=[-30:0.2:30];
y=[-30:0.2:30];
[x,y]=meshgrid(x,y);
n=5;
M = moviein(n);
for i=1:n
z=sin(sqrt(2*(x).^2+2*(y).^2)-2*pi*i/10);
zz=plot3(x,y,z,'parent',gca);
mesh(x,y,z);
grid on;
colormap([0,0.9,0.5]);
light('position',[1,1,2],'style','local','color','white');
material([0.5,0.4,0.3,10,0.3]);
set(gca,'zlim',[-10,10]');
M(i)=getframe(gca);
end
movie(M,20)
创建电影剪辑文件,并存储起来,如下:
aviobj=avifile('文件名.avi','fps',3);%定义一个avi文件,
%AVIOBJ = AVIFILE(FILENAME,'PropertyName',VALUE,'PropertyName',VALUE,...)
%各属性详细说明见matlab帮助
for i=1:n
%在当前窗体上生成一帧图像
frame=getframe(gca); %获得一帧图像
aviobj=addframe(aviobj,frame);%并加到电影剪辑文件中
end
aviobj=close(aviobj);%关闭文件,结束数值仿真模拟过程。
【例2】水波纹动态显示
效果图
filename = '水波纹动态显示.gif';
x=-8:0.5:8;
[XX,YY]=meshgrid(x);
r=sqrt(XX.^2+YY.^2)+eps;
Z=sin(r)./r;
surf(Z);
theAxes=axis;
fmat=moviein(20);
for j=1:20
surf(sin(2*pi*j/20)*Z,Z)
axis(theAxes)
fmat(:,j)=getframe;
%下面语句是将静态图像的每一帧进行叠加存储,并写入到filename文件夹中
f = getframe(gcf);
imind = frame2im(f);
[imind,cm] = rgb2ind(imind,256);
if j == 1
imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
else
imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
end
end
movie(fmat,10)
总结:
%下面语句生成gif动态图的完整子程序。
%%filename = '文件名.gif';
%%f = getframe(gcf);
%%imind = frame2im(f);
%%[imind,cm] = rgb2ind(imind,256);
%%if i == 1
%%imwrite(imind,cm,filename,'gif', 'Loopcount',inf,'DelayTime',0.1);
%%else
%%imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0.1);
%%end
只要将此程序模块插入到,动态循环for语句中,即可生成gif动画。
|
请发表评论