MATLAB动画图作动态图精品资料.doc
MATLAB技术论坛电子期刊 编辑:xiezhh制作:MATLAB技术论坛版权:MatlabSky©版权所有网址: 第1期2010.09No.1中国权威MATLAB论坛核心期刊 MATLAB技术论坛简介 目 录1 动画的制作. 11.1 电影动画. 11.1.1 电影动画演示实例(一)千变万化的线条. 21.1.2 电影动画演示实例(二)跳动的红心. 21.2 擦除动画. 31.2.1 Matlab擦除重绘动画实例(一)运动的小球. 41.2.2 Matlab擦除重绘动画实例(二)单摆横梁. 51.2.3 Matlab擦除重绘动画实例(三)时钟演示. 51.2.4 Matlab擦除重绘动画实例(四)小球绕跑道运动. 71.3 质点动画. 81.3.1 质点动画演示(一) 81.3.2 质点动画演示(二)平抛运动. 81.3.3 质点动画演示(三)导弹发射. 91.4 霓虹灯效果动画. 91.4.1 霓虹灯效果动画实例(一) 霓虹闪烁的球体. 91.4.2 霓虹灯效果动画实例(二) 一颗花心. 91.5 GIF格式动画制作. 101.5.1 GIF格式动画制作案例绕螺旋线运动的小球. 102 动画的保存. 103 有关动画制作的实验报告. 114 更多动画实例. 144.1 电影动画演示旋转的山峰. 144.2 擦除动画实例卫星绕地球运动(注释很详细) 144.3 擦除动画实例太阳地球月亮卫星,绕转演示动画(注释很详细) 155 光学夫朗和费衍射现象模拟MATLAB源代码. 166 牛顿环动画演示MATLAB源代码. 187 使用MATLAB绘制原子轨道和电子云图形. 198 振动摆MATLAB动画源代码. 19 MATLAB基础应用版块Matlab中动画的实现、制作和保存 Matlab的确是一个很优秀的工程计算软件,除了强大的矩阵运算,仿真分析外,绘图功能也是相当的强大。但是由于Matlab本身的多线程编程缺陷(所谓多线程,就是MATLAB没法同时执行多个回调,只能排队一个一个的按顺序运行,Timer对象除外,它是MATLAB中唯一能够执行多线程的方法),想要动态的画图,并且能够很好的在GUI中得到控制,还不是一件很容易的事情。但是动画具有生动形象直观的好处,对我的教学、研究等都有不小的作用。那好,我在这里勉为其难的介绍下Matlab中是如何制作动画的。1 动画的制作Matlab中动画实现的方法主要有下面三种1.1 电影动画 帖子地址: 从不同的视角拍下一系列对象的图形,并保存到变量中,然后按照一定的顺序像电影一样播放。 电影动画的好处就是,运行一次可以多次播放,甚至可以直接生成avi文件,直接独立与Matlab环境播放。这是其它三种动画制作方法所不具备的。MATLAB中,创建电影动画的过程分为以下四步:step1:调用moviein函数对内存进行初始化(该步骤在Matlab5.3以上均可省略),创建一个足够大的矩阵,使之能够容纳基于当前坐标轴大小的一系列指定的图形(此处称为帧)。step2:调用getframe函数生成每个帧。该函数返回一个列矢量,利用这个矢量,就可以创建一个电影动画矩阵。getframe函数可以捕捉动画帧,并保存到矩阵中。一般将该函数放到for循环中得到一系列的动画帧。该函数格式有:(1)F=gefframe,从当前图形框中得到动画帧(2)F=gefframe(h),从图形句柄h中得到动画帧(3)F=getframe(h,rect),从图形句柄h的指定区域rec中得到动画帧step3:调用movie函数按照指定的速度和次数运行该电影动画。当创建了一系列的动画帧后,可以利用movie函数播放这些动画帧。该函数的主要格式有:(1)movie(M),将矩阵M中的动画帧播放一次(2)movie(M,n),将矩阵M中的动画帧播放n次(3)movie(M,n,fps),将矩阵M中的动画帧以每秒fps帧的速度播放n次step4:调用movie2avi函数可以将矩阵中的一系列动画帧转换成视频文件avi文件。这样,即使脱离了matlab环境都可以播放动画。 该方法的经典格式是:%录制电影动画for j=1:n%这里输入我们的绘图命令%M(j) = getframe;endmovie(M)%单帧显示方法f = getframe(gcf);colormap(f.colormap);image(f.cdata); 1.1.1 电影动画演示实例(一)千变万化的线条%by dynamic%see also %2008.7.12 close allfigure('toolbar','none','menubar','none','NumberTitle',.'off','name','电影动画录制Matlabsky'); axis equal m=moviein(20,gcf);%在当前窗口下,截取20帧set(gca,'nextplot','replacechildren','box','off','color','b','xgrid','on') title('截图当前窗口的20帧动画')for j=1:20 plot(fft(eye(j+16) m(:,j)=getframe(gcf); %截取动画帧,保存到m变量中end hh=figure('toolbar','none','menubar','none','NumberTitle',.'off','name','电影动画播放Matlabsky'); title('将截取的动画播放5遍')set(gca,'xtick','ytick','xticklabel','yticklabel',)movie(hh,m,5) 1.1.2 电影动画演示实例(二)跳动的红心帖子地址: % by xiezhhx = linspace(-2,2,100);X,Y,Z = meshgrid(x,x,x); I1 = (X.2+9/4*Y.2+Z.2-1).3-X.2.*Z.3-9/80*Y.2.*Z.3; p = patch(isosurface(X,Y,Z,I1,0); set(p, 'FaceColor', 'red', 'EdgeColor', 'none'); view(3); axis equal ;axis off;light('Posi',0 -2 3); % 在(0,-2,3)点处建立一个光源lighting phongset(gca,'nextplot','replacechildren');% 记录电影XX = get(p,'XData');YY = get(p,'YData');ZZ = get(p,'ZData');for j = 1:20 bili = sin(pi*j/20); set(p,'XData',bili*XX,'YData',bili*YY,'ZData',bili*ZZ) F(j) = getframe;end% 放映10次movie(F,10)1.2 擦除动画 帖子地址: 画在图形窗口中按照一定的算法连续擦除和重绘图形对象,表现为动画,这个也是MATLAB中使用最多的方法。 使用Matlab的绘图函数不断重复绘制图形对象,重绘过程中递增式地改变图形对象位置将产生动画效果。在重绘对象的过程中之所以能产生动画效果是由于对原来的图形对象进行了擦除处理。MATLAB中,创建擦除重绘动画的过程分为以下三步:step1:设置重绘对象的擦除模式'EraseMode'模式Matlab的图形绘制函数允许采用不同的擦除模式来擦除原来的对象,不同的擦除模式将产生不同的动画效果。擦除模式是通过没置“EraseMode”属性来完成的,一共有三种擦除模式:none:重新绘制图形对象时不擦除原来的对象,这种模式可动态演示图形的生成过程,如曲线和旋转曲砸的生成过程 background:在重新绘制图形对象之前。用背景色重绘对象来达到擦除原来图形对象的目的。该模式会擦除任何对象和它下面的任何图形Xor:在重新绘制图形对象之前,只擦除原来的对象,不会擦除其他对象或图形。这种模式能产生图形对象移动的效果step2:在循环语句中使用set更改图形的xdata,ydata和zdata等坐标数据step3:使用darwnow命令刷新屏幕 该方法的经典格式是:%擦除重绘模式动画%选择一个擦除模式set(h,'erasemode',erasemode)%h是需要执行动画图像的句柄,一般都是由line或者plot创建%需要执行一些图形计算命令%循环语句中更新坐标数据,一般使用for或者whilefor i=1:n % %必要的MATLAB命令 % set(h,'xdata',xdata,'ydta',ydata)%更新图像的坐标数据 drownnow%刷新屏幕 % %其它Matlab语句 %end 1.2.1 Matlab擦除重绘动画实例(一)运动的小球function f=anim_ball(K,ki)%演示红色小球沿一条封闭旋螺线运动的实时动画% 仅演示实时动画的调用格式为 anim_ball(K)% 既演示实时动画又拍摄照片的调用格式为 f=anim_ball(K,ki)% K 红球运动的循环数(不小于 1 )% ki 指定拍摄照片的瞬间,取 1 到 1034 间的任意整数% f 存储拍摄的照片数据,可用 image(f.cdata) 观察照片% 产生封闭的运动轨线%by dynamic%all rights reserved by %2007.10.26%t1=(0:1000)/1000*10*pi;x1=cos(t1);y1=sin(t1);z1=-t1;t2=(0:10)/10;x2=x1(end)*(1-t2);y2=y1(end)*(1-t2);z2=z1(end)*ones(size(x2);t3=t2;z3=(1-t3)*z1(end);x3=zeros(size(z3);y3=x3;t4=t2;x4=t4;y4=zeros(size(x4);z4=y4;x=x1 x2 x3 x4;y=y1 y2 y3 y4;z=z1 z2 z3 z4;h=figure('numbertitle','off','name','擦除动画演示(运动的小球)Matlabsky')plot3(x,y,z,'b')axis off %绘制红点%擦除模式设为xorh=line('Color',1 0 0,'Marker','.','MarkerSize',40,'EraseMode','xor');n=length(x);i=1;j=1;%循环改变坐标,表现为小球运动while 1 if ishandle(h),return,end set(h,'xdata',x(i),'ydata',y(i),'zdata',z(i); drawnow; pause(0.0005) %这里设置小球运动速度 i=i+1; if nargin=2 & nargout=1 if(i=ki&j=1);f=getframe(gcf);end %获取指定的帧,保存到f中 end if i>n %判断是否运行了一周,是将i设置为1,并将运行周数j加1 i=1;j=j+1; %判断是否到指定的运行周数,是,退出 if j>K;break;end endend 1.2.2 Matlab擦除重绘动画实例(二)单摆横梁%挂摆横梁%by dynamic%see also %2008.6.9%h=figure('numbertitle','off','name','擦除动画演示(挂摆横梁)Matlabsky')%绘制横梁plot(-0.2;0.2,0;0,'-k','linewidth',20);%画初始位置的单摆g=0.98;%重力加速度,可以调节摆的摆速l=1;%摆长theta0=pi/4;%初始角度x0=l*sin(theta0);%初始x坐标y0=-l*cos(theta0);%初始y坐标axis(-0.75,0.75,-1.25,0);axis off%创建摆锤%擦除模式为xorhead=line(x0,y0,'color','r','linestyle','.','erasemode','xor','markersize',40);%创建摆杆body=line(0;x0,-0.05;y0,'color','b','linestyle','-','erasemode','xor');%摆的运动t=0;%时间变量dt=0.01;%时间增量while 1 t=t+dt; theta=theta0*cos(sqrt(g/l)*t);%单摆角度与时间的关系 x=l*sin(theta); y=-l*cos(theta); if ishandle(h),return,end set(head,'xdata',x,'ydata',y);%改变擦除对象的坐标数据 set(body,'xdata',0;x,'ydata',-0.05;y); drawnow;%刷新屏幕end 1.2.3 Matlab擦除重绘动画实例(三)时钟演示%将下列命令保存到M文件中,直接运行%Matlab时钟动画演示%rewrite by dynamic%more information please go to try close allhfig=figure('NumberTitle','off','name',.'Clock Animation Demo-by MatlabSky','MenuBar','none');theta=linspace(0,6.3,1000);x1=8*cos(theta);y1=8*sin(theta);plot(x1,y1,'b','linewidth',1.4)%绘制外表盘hold onaxis equalx2=7*cos(theta);y2=7*sin(theta);plot(x2,y2,'y','linewidth',3.5)%绘制内表盘fill(0.4*cos(theta),0.4*sin(theta),'r');%绘制指针转轴axis off axis(-10 10 -10 10)set(gca,'position',0.13 0.05 0.775 0.815)title(date,'fontsize',18)for k=1:12;xk=9*cos(-2*pi/12*k+pi/2);yk=9*sin(-2*pi/12*k+pi/2);plot(xk/9*8 xk/9*7,yk/9*8 yk/9*7,'color',0.3 0.8 0.9);text(xk,yk,num2str(k),'fontsize',16,'color',.0.9 0.3 0.8,'HorizontalAlignment','center');%表盘时刻标度end% 计算时针位置ti=clock;th=-(ti(4)+ti(5)/60+ti(6)/3600)/12*2*pi+pi/2;xh3=4.0*cos(th);yh3=4.0*sin(th);xh2=xh3/2+0.5*cos(th-pi/2);yh2=yh3/2+0.5*sin(th-pi/2);xh4=xh3/2-0.5*cos(th-pi/2);yh4=yh3/2-0.5*sin(th-pi/2);hh=fill(0 xh2 xh3 xh4 0,0 yh2 yh3 yh4 0,0.6 0.5 0.3);% 计算分针位置tm=-(ti(5)+ti(6)/60)/60*2*pi+pi/2;xm3=6.0*cos(tm);ym3=6.0*sin(tm);xm2=xm3/2+0.5*cos(tm-pi/2);ym2=ym3/2+0.5*sin(tm-pi/2);xm4=xm3/2-0.5*cos(tm-pi/2);ym4=ym3/2-0.5*sin(tm-pi/2);hm=fill(0 xm2 xm3 xm4 0,0 ym2 ym3 ym4 0,0.6 0.5 0.3);% 计算秒针位置ts=-(ti(6)/60*2*pi+pi/2;hs=plot(0 7*cos(ts),0 7*sin(ts),'color','w','linewidth',2);set(gcf,'doublebuffer','on');while 1;ti=clock;%每次读取系统时间,并进行运算% 计算时针位置th=-(ti(4)+ti(5)/60+ti(6)/3600)/12*2*pi+pi/2;xh3=4.0*cos(th);yh3=4.0*sin(th);xh2=xh3/2+0.5*cos(th-pi/2);yh2=yh3/2+0.5*sin(th-pi/2);xh4=xh3/2-0.5*cos(th-pi/2);yh4=yh3/2-0.5*sin(th-pi/2);set(hh,'XData',0 xh2 xh3 xh4 0,'YData',0 yh2 yh3 yh4 0) % 计算分针位置tm=-(ti(5)+ti(6)/60)/60*2*pi+pi/2;xm3=6.0*cos(tm);ym3=6.0*sin(tm);xm2=xm3/2+0.5*cos(tm-pi/2);ym2=ym3/2+0.5*sin(tm-pi/2);xm4=xm3/2-0.5*cos(tm-pi/2);ym4=ym3/2-0.5*sin(tm-pi/2);set(hm,'XData',0 xm2 xm3 xm4 0,'YData',0 ym2 ym3 ym4 0)% 计算秒针位置ts=-(ti(6)/60*2*pi+pi/2;set(hs,'XData',0 7*cos(ts),'YData',0 7*sin(ts)drawnow;pause(0.09)endcatch'MatlabSky-打造最优、专业和权威的Matlab技术交流平台!更多信息参见:'.'<a href="matlab:web "></a>'returnend 1.2.4 Matlab擦除重绘动画实例(四)小球绕跑道运动%小球绕跑道运动%rewrite by dynamic%more information please go to %figure('numbertitle','off','name',.'Matlab Animation Demo-by matlabsky','MenuBar','none')prompt='请输入速度v:','请输入长度L:','请输入半径r:'default='5','10','2'v=5;L=10;r=2;p=inputdlg(prompt,'输入参数',1,default);v=str2double(p(1);L=str2double(p(2);r=str2double(p(3);if v<=0|L<=0|r<=0 warndlg('Matlabsky提醒您:输入参数必须为整数','警告')else axis(0,2*r+L,0,2*r) ox1=r;oy1=r;ox2=r+L;oy2=r; x1=r:0.015*v:r+L; y1=2*r*ones(size(x1); thita=0:0.015*v/r:pi; x2=sin(thita)*r+ox2; y2=cos(thita)*r+oy2; x3=r+L:-0.015*v:r; y3=zeros(size(x3); x4=-sin(thita)*r+ox1; y4=-cos(thita)*r+oy1; x=x1 x2 x3 x4; y=y1 y2 y3 y4; plot(x,y); text(0,-2,'长度L=' num2str(L) ',' . '半径r=' num2str(r) ',' '速度v=' num2str(v); axis equal set(gca,'Visible','off') hm=line(r,2*r,'color','red','marker','.','markersize',37,'erasemode','xor'); while 1 for i=1:length(x) try set(hm,'xdata',x(i),'ydata',y(i); pause(0.0003) drawnow catch 'MatlabSky-打造最优、专业和权威的Matlab技术交流平台!'. '更多信息参见:<a href="matlab:web'. '"> </a>' return end end endend1.3 质点动画 帖子地址: 用comet()等函数绘制彗星图,它能演示一个质点的运动。质点运动轨迹动画方式是最简单的动画产生方式,顾名思义,就是产生一个顺着曲线轨迹运动的质点来操作。Matlab中提供了comet和comet3命令来实现质点运动轨迹动画的绘制,其常用格式为:comet(xdata,ydata,p) % p是指彗星的尾巴的长度,可以是常数或者size(x)大小的向量其他具体格式大家可以参考doc comet帮助系统该方法的使用一般使用步骤如下:step1:求解出质点完整的运动轨迹坐标x,y和zstep2:使用comet或者comet3直接绘制动点1.3.1 质点动画演示(一)%by dynamic%see also %2008.6.23%t=0:pi/50:10*pi;x=30*sin(t);y=30*cos(t);z=t;plot3(x,y,z);hold on%axis equalcomet3(x,y,z,0.5) 1.3.2 质点动画演示(二)平抛运动%by dynamic%see also %2008.6.23%vx = 40;t = 0:0.01:10;x = vx*t;y = -9.8*t.2/2;comet(x,y) 1.3.3 质点动画演示(三)导弹发射%by dynamic%see also %2008.6.13%vx = 100*cos(1/4*pi);vy = 100*sin(1/4*pi);t = 0:0.001:15;x = vx*t;y = vy*t-9.8*t.2/2;comet(x,y)1.4 霓虹灯效果动画帖子地址: 如今繁华大都市的夜色中,霓虹闪烁,煞是好看,调用MATLAB中的spinmap函数可以做出这种效果的动画,它是通过旋转颜色映像的方式来呈现这种霓虹闪烁的动画效果。spinmap函数的调用格式如下:spinmap % 旋转颜色映像约5秒钟spinmap(t) % 旋转颜色映像约t秒钟,具体时间取决于硬件spinmap(t,inc) % 旋转颜色映像约t秒钟,并设置增量参数inc,该参数用来调整闪烁频率spinmap('inf') % 不限时旋转颜色映像,若需终止,请按Ctrl+C键 1.4.1 霓虹灯效果动画实例(一) 霓虹闪烁的球体% by xiezhhsphere; % 绘制单位球面axis equal; % 设置坐标显示比例相同axis off; % 隐藏坐标轴spinmap(20,1); % 设置增量参数为1,旋转颜色映像约20秒 1.4.2 霓虹灯效果动画实例(二) 一颗花心帖子地址: % by qibbxxtclear;clc;close allc=5;t=linspace(-c,c);x,y=meshgrid(t);z=17*x.2-16*abs(x).*y+17*y.2-225;pcolor(x,y,z);shading interppause(2);spinmap(10)1.5 GIF格式动画制作帖子地址: GIF格式动画以其小巧受到大家的广泛欢迎,本贴以案例形式做一个总结。制作GIF动画要用到getframe、frame2im、rgb2ind和imwrite函数,getframe函数用来抓取当前图形窗口中的图像,frame2im函数和rgb2ind函数用来将抓取的图像转为索引图像,imwrite函数用来将索引图像写入GIF格式动画,需要注意的是imwrite函数不能将真彩图像写入GIF格式动画。关于这些函数的具体用法,这里不再详述,请版友自行查阅帮助。下面只给出案例。 1.5.1 GIF格式动画制作案例绕螺旋线运动的小球% by xiezhhfilename = '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); endend2 动画的保存帖子地址: 下面再讲述下生成的动画如何保存。动画保存,只有对电影动画而言才有意义,其他两种谈不上保存,因为他们都是实时的,眨眼就过的。而电影动画是先将动画一帧一帧的保存下来,在使用movie函数播放。它的好处是,运行一次MATLAB程序就可以播放无数次,只要你的帧数据还在。但是这还是不方便,由于它没法脱离MATLAB环境,很讨厌。还好MATLAB为我们提供了movie2avi函数,它可以把动画直接转换成avi文件,而avi文件则可以脱离Matalb环境而在其他地方运行了。 请教如何保存matlab的动画?前几天刚答辩完,给你贴上。function avimakewarning off;load dataM,N,K=size(data);data=data/(max(abs(data(:);aviobj = avifile('mymovie.avi','fps',10); for kk=1:10:K imagesc(data(:,:,kk); set(gca,'clim',-1 1); colormap(hsv(128) frame = getframe(gca); aviobj = addframe(aviobj,frame);endaviobj = close(aviobj); 直接保存gif动画m(:,k)=getframe;%构造gif图像的帧,nn(:,:,:)=getframe;%转换为可以直接输出的格式(这会是图像丢失)%如果要制作彩色的图像,你只能把生成的彩色图像单独制作(使用其他软件)nn1=nn.cdata;nn1=rgb2gray(nn1);imwrite(nn1,'out.gif','gif','WriteMode','append')3 有关动画制作的实验报告帖子地址: 设计题目:三维与抛物动画仿真 姓 名: 学 号: 院 系: 专 业: 指导教师: 一课程设计目的: 1.熟悉课程设计的基本流程; 2:掌握MATLAB语法结构及调试方法; 3:熟悉MATLAB函数调用,熟练二维画图; 4:掌握MATLAB语言在控制方面的运用; 5:学会用MATLAB进行基本仿真; 6:掌握MATLAB编程技巧,提高编程水平。 二系统分析与设计该动画仿真开始时是一个三维动画旋转13次,旋转完后将出现另一个窗口继续进行抛物线旋转动画。抛物线旋转26次后结束旋转,此时动画结束,最后关闭动画窗口,返回MATLAB语言环境。设计要求:第一个动画是三维图形在空中旋转, 第二个是抛物线按照一定的规则旋转,旋转出 一个有形的三维空间多边形。此MATLAB动画有两个小动画组成,总体为自动弹出式,即,第一个三维动画结束,自动弹出第二个窗口实现抛物线旋转动画。第一个三维动画运用figure命令创建图形窗口,创建帧矩阵,填充颜色。用movie命令控制转动次数。第二个动画同样运用figure命令创建一个信的窗口,当第一个动画结束自动由figure命令弹出第二个窗口运行动画。主要是画出三维