MATLAB动画图作动态图.docx
- 文档编号:9357312
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:39
- 大小:283.05KB
MATLAB动画图作动态图.docx
《MATLAB动画图作动态图.docx》由会员分享,可在线阅读,更多相关《MATLAB动画图作动态图.docx(39页珍藏版)》请在冰点文库上搜索。
MATLAB动画图作动态图
MATLAB技术论坛
电子期刊
编辑:
xiezhh
制作:
MATLAB技术论坛
版权:
MatlabSky©版权所有
网址:
第1期
2010.09
No.1
中国权威MATLAB论坛核心期刊
MATLAB技术论坛简介
目 录
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环境都可以播放动画。
该方法的经典格式是:
%录制电影动画
forj=1:
n
%
%这里输入我们的绘图命令
%
M(j)=getframe;
end
movie(M)
%单帧显示方法
f=getframe(gcf);
colormap(f.colormap);
image(f.cdata);
1.1.1 电影动画演示实例
(一)——千变万化的线条
%bydynamic
%seealso
%2008.7.12
closeall
figure('toolbar','none','menubar','none','NumberTitle',...
'off','name','电影动画录制——Matlabsky');
axisequal
m=moviein(20,gcf);%在当前窗口下,截取20帧
set(gca,'nextplot','replacechildren','box','off','color','b','xgrid','on')
title('截图当前窗口的20帧动画')
forj=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 电影动画演示实例
(二)——跳动的红心
帖子地址:
%byxiezhh
x=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);
axisequal;
axisoff;
light('Posi',[0-23]); %在(0,-2,3)点处建立一个光源
lightingphong
set(gca,'nextplot','replacechildren');
%记录电影
XX=get(p,'XData');
YY=get(p,'YData');
ZZ=get(p,'ZData');
forj=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或者while
fori=1:
n
%
%必要的MATLAB命令
%
set(h,'xdata',xdata,'ydta',ydata)%更新图像的坐标数据
drownnow%刷新屏幕
%
%其它Matlab语句
%
end
1.2.1 Matlab擦除重绘动画实例
(一)——运动的小球
functionf=anim_ball(K,ki)
%
%演示红色小球沿一条封闭旋螺线运动的实时动画
%仅演示实时动画的调用格式为anim_ball(K)
%既演示实时动画又拍摄照片的调用格式为f=anim_ball(K,ki)
%K红球运动的循环数(不小于1)
%ki指定拍摄照片的瞬间,取1到1034间的任意整数
%f存储拍摄的照片数据,可用image(f.cdata)观察照片
%产生封闭的运动轨线
%
%
%bydynamic
%allrightsreservedby
%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=[x1x2x3x4];y=[y1y2y3y4];z=[z1z2z3z4];
h=figure('numbertitle','off','name','擦除动画演示(运动的小球)——Matlabsky')
plot3(x,y,z,'b')
axisoff
%绘制红点
%擦除模式设为xor
h=line('Color',[100],'Marker','.','MarkerSize',40,'EraseMode','xor');
n=length(x);
i=1;j=1;
%循环改变坐标,表现为小球运动
while1
if~ishandle(h),return,end
set(h,'xdata',x(i),'ydata',y(i),'zdata',z(i));
drawnow;
pause(0.0005)%这里设置小球运动速度
i=i+1;
ifnargin==2&nargout==1
if(i==ki&j==1);f=getframe(gcf);end %获取指定的帧,保存到f中
end
ifi>n
%判断是否运行了一周,是将i设置为1,并将运行周数j加1
i=1;j=j+1;
%判断是否到指定的运行周数,是,退出
ifj>K;break;end
end
end
1.2.2 Matlab擦除重绘动画实例
(二)——单摆横梁
%挂摆横梁
%bydynamic
%seealso
%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]);
axisoff
%创建摆锤
%擦除模式为xor
head=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;%时间增量
while1
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时钟动画演示
%rewritebydynamic
%moreinformationpleasegoto
try
closeall
hfig=figure('NumberTitle','off','name',...
'ClockAnimationDemo--byMatlabSky','MenuBar','none');
theta=linspace(0,6.3,1000);
x1=8*cos(theta);y1=8*sin(theta);
plot(x1,y1,'b','linewidth',1.4)%绘制外表盘
holdon
axisequal
x2=7*cos(theta);y2=7*sin(theta);
plot(x2,y2,'y','linewidth',3.5)%绘制内表盘
fill(0.4*cos(theta),0.4*sin(theta),'r');%绘制指针转轴
axisoff
axis([-1010-1010])
set(gca,'position',[[0.130.050.7750.815]])
title(date,'fontsize',18)
fork=1:
12;
xk=9*cos(-2*pi/12*k+pi/2);
yk=9*sin(-2*pi/12*k+pi/2);
plot([xk/9*8xk/9*7],[yk/9*8yk/9*7],'color',[0.30.80.9]);
text(xk,yk,num2str(k),'fontsize',16,'color',...
[0.90.30.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([0xh2xh3xh40],[0yh2yh3yh40],[0.60.50.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([0xm2xm3xm40],[0ym2ym3ym40],[0.60.50.3]);
%计算秒针位置
ts=-(ti(6))/60*2*pi+pi/2;
hs=plot([07*cos(ts)],[07*sin(ts)],'color','w','linewidth',2);
set(gcf,'doublebuffer','on');
while1;
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',[0xh2xh3xh40],'YData',[0yh2yh3yh40])
%计算分针位置
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',[0xm2xm3xm40],'YData',[0ym2ym3ym40])
%计算秒针位置
ts=-(ti(6))/60*2*pi+pi/2;
set(hs,'XData',[07*cos(ts)],'YData',[07*sin(ts)])
drawnow;
pause(0.09)
end
catch
['MatlabSky--打造最优、专业和权威的Matlab技术交流平台!
更多信息参见:
'...
' web">'] return end 1.2.4 Matlab擦除重绘动画实例(四)——小球绕跑道运动 %小球绕跑道运动 %rewritebydynamic %moreinformationpleasegoto % figure('numbertitle','off','name',... 'MatlabAnimationDemo--bymatlabsky','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)); ifv<=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=[x1x2x3x4]; y=[y1y2y3y4]; plot(x,y); text(0,-2,['长度L='num2str(L)','... '半径r='num2str(r)',''速度v='num2str(v)]); axisequal set(gca,'Visible','off') hm=line(r,2*r,'color','red','marker','.','markersize',37,'erasemode','xor'); while1 fori=1: length(x) try set(hm,'xdata',x(i),'ydata',y(i)); pause(0.0003) drawnow catch ['MatlabSky--打造最优、专业和权威的Matlab技术交流平台! '... '更多信息参见: web'... '">'] return end end end end 1.3质点动画 帖子地址: 用comet()等函数绘制彗星图,它能演示一个质点的运动。 质点运动轨迹动画方式是最简单的动画产生方式,顾名思义,就是产生一个顺着曲线轨迹运动的质点来操作。 Matlab中提供了comet和comet3命令来实现质点运动轨迹动画的绘制,其常用格式为: comet(xdata,ydata,p) %p是指彗星的尾巴的长度,可以是常数或者size(x)大小的向量 其他具体格式大家可以参考doccomet帮助系统 该方法的使用一般使用步骤如下: step1: 求解出质点完整的运动轨迹坐标x,y和z step2: 使用comet或者comet3直接绘制动点 1.3.1 质点动画演示 (一) %bydynamic %seealso %2008.6.23 % t=0: pi/50: 10*pi; x=30*sin(t); y=30*cos(t); z=t; plot3(x,y,z); holdon %axisequal comet3(x,y,z,0.5) 1.3.2 质点动画演示 (二)——平抛运动 %bydynamic %seealso %2008.6.23 % vx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MATLAB 动画图 动态