在MATLAB中进行动画制作
之前应该是说是因为上最优化理论的时候,老师叫我们制作一个动画,用来比较最优降线和和其他曲线下落时间。自己也是第一次用MATLAB来制作动画,首先自己先去网上下载程序,找一些相关的材料。但是找到的材料都是描述在动画中实现一个物体移动的,我的这个程序中需要实现多个物体同时一定的轨迹进行移动。
在MATLAB中可以保存的动画格式有两种,一种是AVI格式,一种是GIF格式的。两种调用的函数不相同。
第一种保存为gif文件的调用格式
先创建一个类似于句柄的对象,这个当你只需要对动画中呈现一个物体的时候你是可以不用需要创建句柄的,也就是调用函数line();
比如说下面这段代码
**********************在动画中呈现一个对象***************************
x = 0:0.01:1;
filename ='testAnimated.gif';%%定义文件名
for n = 1:0.5:5
y1= x.^n;
%%y=x;
plot(x,y1)
%%plot(x,y)
%%hold on
drawnow
frame = getframe(1);
im = frame2im(frame);
[A,map] = rgb2ind(im,256);
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.1);
end
但是在后来实践中发现,在这个程序中画两个对象的话,加上holdon 也是可以呈现一种动画效果的,但是循环中的每一条轨迹都是保留了下来的了。不加holdon的话,只能呈现那条不变的曲线,具体原因不明,望高手解答,而且getframe中的参数也可以改为 (gcf)。
****************************在动画中呈现多个对象*********************
filename ='testAnimated.gif';
n=1000;%%用于控制小球的运动速度
theta=0:1*pi/n:1*pi;
x=5*(theta-sin(theta));%%最优降线函数表达式
y1=-5*(1-cos(theta)); %%最优降线函数表达式
y2=-(2/3.14)*x;
y3=-10*sin(0.1*x);
plot(x,y1,'b');
hold on
plot(x,y2,'b');
hold on
plot(x,y3,'b');
h1=line('color',[1,0,0],'marker','.','markersize',50);
h2=line('color',[1,1,0],'marker','.','markersize',50);
h3=line('color',[1,0.5,0.5],'marker','.','markersize',50);
i=1;
while i<1000
set(h1,'xdata',x(i),'ydata',y1(i));
set(h2,'xdata',x(i),'ydata',y2(i));
set(h3,'xdata',x(i),'ydata',y3(i));
F=getframe(gcf);
A=frame2im(F);
[A,map]=rgb2ind(A,256);
i=i+1;
imwrite(A,map,filename,'gif','WriteMode','append','DelayTime',0.1);
end
********************************************************************
最后都是调用这个函数imwrite,在这个函数中的WriteMode 是一种写入模式,我使用的是append 模式,如果使用overwrite模式的话,则没有最终呈现的就是没有动画的效果了。但是使用append模式的时候,其保存的文件名则必须是已经存在的,也就是说要提前定义好文件名,而不是像AVI格式的那种,可以直接在调用函数的时候调用。函数后面的参数就是延迟时间了。
第二种保存为AVI格式的动画
1)使用旧版本函数生成AVI动画程序
**********************使用movie2avi 函数****************************
n=1000;%%用于控制小球的运动速度
theta=0:1*pi/n:1*pi;
x=5*(theta-sin(theta));
y1=-5*(1-cos(theta));
y2=-(2/3.14)*x;
y3=-10*sin(0.1*x);
plot(x,y1,'b');
hold on
plot(x,y2,'b');
hold on
plot(x,y3,'b');
h1=line('color',[1,0,0],'marker','.','markersize',50);
h2=line('color',[1,1,0],'marker','.','markersize',50);
h3=line('color',[1,0.5,0.5],'marker','.','markersize',50);
i=1;
while i<1000
set(h1,'xdata',x(i),'ydata',y1(i));
set(h2,'xdata',x(i),'ydata',y2(i));
set(h3,'xdata',x(i),'ydata',y3(i));
mov(i) = getframe;
i=i+1;
movie2avi(mov,'control.avi', 'compression', 'None','fps',30);
end
但是在使用这个函数movie2avi的时候程序一直在出警告:Warning:MOVIE2AVI will be removed in a future release. Use VIDEOWRITER instead. 也就是这个函数在以后的版本将不会使用,建议我们采取新的函数代替。
*********************************************************************
2)使用新版本函数来生成AVI动画程序
**********************使用writeVideo函数****************************
v =VideoWriter('peaks.avi');提前创建AVI文件
open(v);
n=100;
theta=0:1*pi/n:1*pi;
x=5*(theta-sin(theta));
y1=-5*(1-cos(theta));
y2=-(2/3.14)*x;
y3=-10*sin(0.1*x);
plot(x,y1,'b');
hold on
plot(x,y2,'b');
hold on
plot(x,y3,'b');
h1=line('color',[1,0,0],'marker','.','markersize',50);
h2=line('color',[1,1,0],'marker','.','markersize',50);
h3=line('color',[1,0.5,0.5],'marker','.','markersize',50);
i=1;
whilei<100
set(h1,'xdata',x(i),'ydata',y1(i));
set(h2,'xdata',x(i),'ydata',y2(i));
set(h3,'xdata',x(i),'ydata',y3(i));
frame =getframe;
i=i+1;
writeVideo(v,frame);
end
使用这个函数也不能在调用函数的时候,生成一个AVI文件,需要提前创建这个文件
*********************************************************
但是在使用这个函数movie2avi的时候程序一直在出警告:Warning:MOVIE2AVI will be removed in a future release. Use VIDEOWRITER instead. 也就是这个函数在以后的版本将不会使用,建议我们采取新的函数代替。
*********************************************************************
PS:另外在使用这个函数的时候,当你突然把程序给动画窗口关掉的时候,会在命令窗口报错:
Error using getframe (line53)
A valid figure or axes handlemust be specified
Error in lijianhua (line 47)
mov(i) = getframe;
其实这个不用担心哈,你的程序并没有问题。
从程序上来说,保存为AVI格式的相对来说更简单一点,但是AVI格式占用的内存比较大,具体采用那种格式还是看个人喜好吧。目前两者在其他的差别上还不是很清楚。