MATLAB中绘制质点轨迹动图并保存成GIF

工作需要在MATLAB中绘制质点轨迹并保存成GIF以便展示。

绘制质点轨迹动图可用comet和comet3命令,使用例子如下:

t = 0:.01:2*pi;
x = cos.*.^2);
y = sin.*.^2);
z = t;
comet;  %绘制二维
%comet3(x,y,z,0.1);  %绘制三维

这有一个问题在于comet或comet3无法控制绘制的动画的速度,为了实现这一点,一个可行的方法是重写comet和comet3,在每一个for循环中增加:

pause

其中interval可以是用户输入的每帧的时间间隔。

为了实现一边绘制动图,一边保存成GIF动画,我的实现方法是重写comet和comet3,具体如下:

在每个for循环的末尾增加:

frame = getframe;
im = frame2im;
[imind,cm] = rgb2ind;
if GifImCount == 1;
imwrite(imind,cm,filename,'gif','DelayTime',interval,
'Loopcount',inf);
else
imwrite(imind,cm,filename,'gif','DelayTime',interval,
'WriteMode','append');
新京葡娱乐场网址,end
GifImCount = GifImCount + 1;

其中GifImCount在程序初始设为0,filename为要存储的gif文件的名称。原先for循环中的drawnow语句可以去掉,因为getframe本身就会调用drawnow函数。

但是这样有一个问题,就是这样只能获取当前帧的动画,尾迹消失了,即无法得到连续的动画效果。这个问题我初始想肯定是getframe里面某处擦除了图形,可以通过修改getframe来解决,但是还是没有解决。最后找到一个权宜之计,那就是重写comet和comet3函数时,不进行原先的body和tail的分别绘制,将comet和comet3中的“%
Grow the body”和“% Clean up the tail”两部分去掉,只留“% Primary
loop”部分,并稍做如下修改:

% Primary loop
for i = 1:m
set(head,'xdata',x,'ydata',y
set(tail,'xdata',x,'ydata',y
frame = getframe;
im = frame2im;
[imind,cm] = rgb2ind;
if GifImCount == 1;
imwrite(imind,cm,filename,'gif','DelayTime',interval,
'Loopcount',inf);
else
imwrite(imind,cm,filename,'gif','DelayTime',interval,
'WriteMode','append');
end
GifImCount = GifImCount + 1;
end

大意是每次绘制都重绘从1到i的点。通过以上的修改,大致能够实现在MATLAB中绘制质点轨迹动图并保存成GIF的效果。

下面是效果:

新京葡娱乐场网址 1

新京葡娱乐场网址 2

如果你有更好的方法,请告知我,谢谢!

相关文章

Comment ()
评论是一种美德,说点什么吧,否则我会恨你的。。。