常用的包括两种方式:plot方式及drawnow方式
以导弹跟踪问题为例子。
位于坐标原点的A船向位于其正东?20个单位的B 船发射导弹,导弹始终对准B船, B船以时速V单位(常数)沿东北?向逃逸。若导弹的速度为3V,导弹的射程是50个单位,画出导弹运?的曲线,导弹是否能在射程内击中B船?
文章图片
plot方式
原理
一定循环次数后画一下移动后的点(若想看动态效果一定要pause一小段时间)
代码
clc;
clear
DeltaT = 0.0000001;
n = 1000000000;
% 导弹最长运行时间100s
PositionA = [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));
% 角度a1
disp('正在模拟测试中');
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-10
for i=1:n
PositionB = 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后再继续下面的操作
endif (abs(sum(PositionA-PositionB))<0.01) & (sqrt(sum(PositionA.*PositionA))<=50) %当导弹和B船足够近且在导弹射程之内
disp('导弹能击中');
break;
end
end
disp('模拟测试完毕');
drawnow方式 【matlab绘制动态图】在使用此方式顺便加入了如何将动态图保存为gif文件
原理
① 首先利用animatedline创造动画线条,可以自定义线条的颜色大小样式等
② 在循环内利用addpoints函数并drawnow
若要在同一个图内画多个动态线,则要创造多个动画线条
clc;
clear
DeltaT = 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-10
for i=1:n
PositionB = 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,关联颜色图为 cm
if 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;
end
end
drawnow;
% 使用drawnow limitrate的时候 帮助手册上说明需最后加一句drawnow
disp('模拟测试完毕');
推荐阅读
- 最优化问题|改进交叉算子的自适应人工蜂群黏菌算法
- matlab|嵌入均衡池的黏菌优化算法
- 最优化问题|加入领导者的黏菌优化算法
- MATLAB图形界面|基于Matlab的汽车出入库计时计费系统
- Matlab旅程|MATLAB的结构化程序设计
- matlab 内存管理 清理内存
- matlab中使用colormap没有效果
- Matlab|圆柱绕流
- MATLAB|Splart-Allmaras湍流模型及MATLAB编程~
- regionprops统计被标记的区域的面积分布,显示区域总数。