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

Posted 金鸡光明右使

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中绘制质点轨迹动图并保存成GIF相关的知识,希望对你有一定的参考价值。

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

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

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

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

pause(interval)

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

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

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

frame = getframe(gcf);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
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(i),\'ydata\',y(i))
set(tail,\'xdata\',x(1:i),\'ydata\',y(1:i))
frame = getframe(gcf);
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
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的效果。

 下面是效果:

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

 

以上是关于MATLAB中绘制质点轨迹动图并保存成GIF的主要内容,如果未能解决你的问题,请参考以下文章

R语言gganimate包创建可视化gif动图并使用anim_save函数保存可视化gif动图(gganimate export to gif)

matlab动画如何保存

matlab 图怎么保存

matlab 绘制三维图并标注每个点的坐标

matlab绘制根轨迹

matlab绘制根轨迹