*** 搜集自dynamic(matlab sky)的资料 *** (一直提示"不良信息", 故稍微编辑下, 对原作者抱歉!)
1) Matlab动画制作(一)——电影动画 (http://www.matlab sky.com/thread-593-1-1.html)
电影动画的好处就是,运行一次可以多次播放,甚至可以直接生成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;
end
movie(M)
%单帧显示方法
f = getframe(gcf); colormap(f.colormap); image(f.cdata);
此外,利用immovie函数,我们可以从多帧图像阵列中创建MATALB 电影动画。
需要注意的是:该函数只能应用于索引图象,所以,如果用户希望其他类型的图像阵列转换为电影动画,则首先将该图像类型转换为索引类型。
电影动画演示实例(一)
%by dynamic, 2008.7.12
close all
figure('toolbar','none','menubar','none','NumberTitle','off','name','电影动画录制——Matlab sky');
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','电影动画播放——Matlab sky');
title('将截取的动画播放5遍'); set(gca,{'xtick','ytick','xticklabel','yticklabel'},{[],[],[],[]})
movie(hh,m,5)
2) Matlab动画制作(二)——擦除动画 (http://www.matlab sky.com/thread-240-1-1.html)
使用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
for i=1:n
%必要的MATLAB命令
set(h,'xdata',xdata,'ydta',ydata)%更新图像的坐标数据
drownnow%刷新屏幕
%其它Matlab语句
end
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, 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','擦除动画演示(运动的小球)——Matlab sky')
plot3(x,y,z,'b'); axis off
%绘制红点
h=line('Color',[1 0 0],'Marker','.','MarkerSize',40,'EraseMode','xor');%擦除模式设为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
end
end
Matlab擦除重绘动画实例(二)——单摆横梁
%挂摆横梁
%by dynamic, 2008.6.9
%
h=figure('numbertitle','off','name','擦除动画演示(挂摆横梁)——Matlab sky')
%绘制横梁
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
%创建摆锤
head=line(x0,y0,'color','r','linestyle','.','erasemode','xor','markersize',40);%擦除模式为xor
%创建摆杆
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
Matlab擦除重绘动画实例(三)——时钟演示
%将下列命令保存到M文件中,直接运行
%Matlab时钟动画演示
%rewrite by dynamic
try; close all
hfig=figure('NumberTitle','off','name','Clock Animation Demo--by Matlab Sky','MenuBar','none');
theta=linspace(0,6.3,1000); x1=8*cos(theta);y1=8*sin(theta);
plot(x1,y1,'b','linewidth',1.4)%绘制外表盘
hold on; axis equal
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');%绘制指针转轴
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)
end
catch
'Matlab Sky--打造最优、专业和权威的Matlab技术交流平台'
return
end
Matlab擦除重绘动画实例(四)——小球绕跑道运动
%小球绕跑道运动
%rewrite by dynamic
%
figure('numbertitle','off','name','Matlab Animation Demo--by matlab sky','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('Matlab sky提醒您:输入参数必须为整数','警告')
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
'Matlab Sky--打造最优、专业和权威的Matlab技术交流平台'
return
end
end
end
end