失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > matlab绘制动态图

matlab绘制动态图

时间:2019-10-01 23:09:28

相关推荐

matlab绘制动态图

常用的包括两种方式:plot方式及drawnow方式

以导弹跟踪问题为例子。

位于坐标原点的A船向位于其正东⽅20个单位的B 船发射导弹,导弹始终对准B船, B船以时速V单位(常数)沿东北⽅向逃逸。若导弹的速度为3V,导弹的射程是50个单位,画出导弹运⾏的曲线,导弹是否能在射程内击中B船?

plot方式

原理

一定循环次数后画一下移动后的点(若想看动态效果一定要pause一小段时间)

代码

clc;clearDeltaT = 0.0000001;n = 1000000000; % 导弹最长运行时间100sPositionA = [0,0]; % A的坐标PositionB = [20,0]; % B的坐标% V = randi(100); %速度为1~100个单位内的随机数V = 200; % V若是0-100,曲线画的太慢a = atan(V*DeltaT/sqrt(2)/(V*DeltaT/sqrt(2)+20)); % 角度a1disp('正在模拟测试中');k = 0; % 用于画图,当循环次数达到500时画一个点plot(PositionA(1),PositionA(2),'.k','MarkerSize',1); % 画出导弹和B船所在的坐标,点的大小为1,颜色为黑色(k),用小点表示grid on; % 打开网格线hold on; % 不关闭图形,继续画图plot(PositionB(1),PositionB(2),'.k','MarkerSize',1); % 画出导弹和B船所在的坐标,点的大小为1,颜色为黑色(k),用小点表示hold on; % 不关闭图形,继续画图axis([0 30 0 10]) % 固定x轴的范围为0-30 固定y轴的范围为0-10for i=1:nPositionB = PositionB + [V*DeltaT/sqrt(2),V*DeltaT/sqrt(2)];a = atan(PositionB(2)-PositionA(2)) / (PositionB(1)-PositionA(1));PositionA = PositionA + [3*V*DeltaT*cos(a),3*V*DeltaT*sin(a)];k = k+1;if mod(k,500) == 0 % 每刷新500次时间就画出下一个导弹和B船所在的坐标 mod(m,n)表示求m/n的余数plot(PositionA(1),PositionA(2),'.k','MarkerSize',1); % 画出导弹和B船所在的坐标,点的大小为1,颜色为黑色(k),用小点表示hold on; % 不关闭图形,继续画图plot(PositionB(1),PositionB(2),'.k','MarkerSize',1); % 画出导弹和B船所在的坐标,点的大小为1,颜色为黑色(k),用小点表示hold on; % 不关闭图形,继续画图pause(0.001); % 暂停0.001s后再继续下面的操作end if (abs(sum(PositionA-PositionB))<0.01) & (sqrt(sum(PositionA.*PositionA))<=50) %当导弹和B船足够近且在导弹射程之内disp('导弹能击中');break;endend disp('模拟测试完毕');

drawnow方式

在使用此方式顺便加入了如何将动态图保存为gif文件

原理

① 首先利用animatedline创造动画线条,可以自定义线条的颜色大小样式等

② 在循环内利用addpoints函数并drawnow

若要在同一个图内画多个动态线,则要创造多个动画线条

clc;clearDeltaT = 0.00001;n = 1000000000; PositionA = [0,0]; % A的坐标PositionB = [20,0]; % B的坐标% V = randi(100); %速度为1~100个单位内的随机数V = 2000; % V若是0-100,曲线画的太慢a = atan(V*DeltaT/sqrt(2)/(V*DeltaT/sqrt(2)+20)); % 角度a1filename = 'test.gif';Fig = figure;disp('正在模拟测试中');an1 = animatedline; % 创造动画线条an1.LineWidth = 1.0;an1.Color = 'b';an2 = animatedline;an2.Color = 'r';an2.LineWidth = 1.0;axis([0 30 0 10]) % 固定x轴的范围为0-30 固定y轴的范围为0-10for i=1:nPositionB = PositionB + [V*DeltaT/sqrt(2),V*DeltaT/sqrt(2)];a = atan(PositionB(2)-PositionA(2)) / (PositionB(1)-PositionA(1));PositionA = PositionA + [3*V*DeltaT*cos(a),3*V*DeltaT*sin(a)];addpoints(an1,PositionA(1),PositionA(2)); %画点addpoints(an2,PositionB(1),PositionB(2));drawnow limitrate; % 加快处理frame = getframe(Fig); % 获得帧数据im = frame2im(frame); % 返回帧数据的相关图像数据[imind,cm]=rgb2ind(im,256); % matlab的gif不支持rgb并转换分别存储,256:rgb的颜色种类;索引图像 imind,关联颜色图为 cmif i==1 % 第一帧的时候overwrite覆盖式存储,并设置GIf的重复次数为无线,即放完后自动再放imwrite(imind,cm,filename,'gif','WriteMode','overwrite','Loopcount',inf); else % 从第二帧开始,让后来的图像叠加到已创的gif文件中且 延时为0 即最快处理imwrite(imind,cm,filename,'gif','WriteMode','append','DelayTime',0);endif (abs(sum(PositionA-PositionB))<0.01) & (sqrt(sum(PositionA.*PositionA))<=50) %当导弹和B船足够近且在导弹射程之内disp('导弹能击中');break;endend drawnow; % 使用drawnow limitrate的时候 帮助手册上说明需最后加一句drawnowdisp('模拟测试完毕');

如果觉得《matlab绘制动态图》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。