• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

MATLAB中绘制质点轨迹动图并保存成GIF - 金鸡光明右使

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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的效果。

 下面是效果:

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

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
delphi线程的应用和spcomm的应用发布时间:2022-07-18
下一篇:
Delphi中使用XlsReadWriteII发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap