- 汽车的任何选择图像加载到Matlab。
- 规模的汽车图像,维护一个广场长宽比不影响数据比例或轴的大小。
- 定义一个汽车图像的中心将遵循的轨迹
- 动画汽车的轨迹——动画只描述了翻译,没有改变方向,但你可以添加一个旋转矩阵来实现,如果你的愿望。
如何将图像添加到情节,根据x, y coordinatates ?
93(30天)
显示旧的评论
接受的答案
亚当Danz
2021年5月12日
编辑:亚当Danz
2021年5月12日
演示1
显示动画的一辆车,
演示2
显示了一个矩形的动画。
示例1:汽车图像
这个演示展示了如何
首先,选择任何一辆车的形象,但最好是有一个透明的背景和填充整个图像空间。我没有在我的汽车图像文件版权的目的。
%读汽车形象
carFile =“car.png”;
(我、地图、透明度)= imread (carFile);
定义道路宽度(集中在y = 0)和汽车的宽度相同的单位。
roadWidth = 8;
carWidth = 3.5;%与road-width相同的单位
定义的轨迹的中心汽车(carX卡里)坐标
carX
和
卡里
是向量。
x = linspace (7、7、50);
carX = linspace(-150、1150、元素个数(x));%的车将轴外的开始和结束
卡里= (1. / (1 + exp (- x)) * roadWidth - roadWidth / 2) * 5;%假定道路集中在y = 0
情节的道路和车辆的轨迹线。
汽车图像缩放数据方面定量和情节方面比如果图的大小,它将scretch汽车图像。为了防止这样的事情发生,figure-resize是关闭的,也是很重要的设置
xlim
和
ylim
和
持有
添加汽车图像之前坐标轴。
无花果=图();
fig.Position (3:4) = (1180、420);
fig.Resize =“关闭”;%禁用图调整自车大小取决于情节长宽比。
movegui(图)
ax =轴(图,“XLim”(1100),“YLim”[8],“XTick”0:200:1000,“ytick”八8,“单位”,“像素”);
框(ax,“上”)
(ax,“上”)
%的阴谋道路边缘和中心线
rightEdge =情节(xlim (ax) roadWidth. / (2, 2),“k -”,“线宽”5);
输入leftEdge =情节(xlim (ax) roadWidth. / (2, 2),“k -”,“线宽”5);
输入leftEdge =情节(xlim (ax) [0 0),“k——”,“线宽”3);
%添加轨迹路径
traj =情节(carX卡里,“——”,“线宽”3,“颜色”[0.9375 0.5 0.5]);% lightcoral
这就是car-image-length会根据你设置的宽度计算
carWidth
根据
PlotBoxAspectRatio
和
DataAspectRatio
。再一次,这是重要的设置限制轴和轴这个步骤之前。
%计算汽车基于指定宽度长度和长宽比
% xlim和ylim必须设置在此之前。轴和纵横比不能改变后的数据!
drawnow ()
暂停(0。)
asScalingFactor = (ax.DataAspectRatio (1) / ax.DataAspectRatio (2)) /…
(ax.PlotBoxAspectRatio (1) / ax.PlotBoxAspectRatio (2));
carLength = carWidth *(我,2)大小/尺寸(我,1)* asScalingFactor;
(
carX,卡里
)指定的位置轨迹的中心在每个时间点的车。然而,图像坐标指定的左下角rectangluar形象。我们还需要图片的右上角每一点沿着轨迹。因此,(
carX,卡里
)代表汽车的中心转化为(
carXi, carYi
),是两个nx2矩阵代表汽车图像左下角和右上角的角落,缩放大小。
carXi = carX (:) + carLength. / (2, 2);%(左、右)
carYi =卡里(:)+ carWidth. / (2, 2);%(低,上)
汽车呈现在第一个轨迹的坐标,然后在一个循环动画,在每个迭代中移动车它的新位置。因为它是一个复杂的图像,动画可以是缓慢的。加快动画,使用一个简单的图像或者没有图像(例如一个矩形)。有四种方式来控制下面的动画的速度。1)增加/减少的数量在轨迹坐标,2)增加
暂停
命令没用(目前),3)减少图像的reslution(见
imresize
),4)记录动画和指定任何你希望(见回放速度
getframe /电影
)。
%画汽车起点&动画轨迹
carImg =显示亮度图像(carXi (1:), carYi(1:),我“AlphaData”、透明度);
为i = 1:尺寸(carXi, 1)
carImg。XData= carXi(i,:);
carImg。YData= carYi(i,:);
drawnow ();
%暂停(1);% < - - - - - -慢下来动画通过增加这个值
结束
示例2:矩形
类似于第一个演示,本文使用一矩形,简化了任务和加快动画。
%定义道路和汽车的大小
roadWidth = 8;
carWidth = 2.8;%与road-width相同的单位
carLenghtFactor = 1.7;%的比例因子
%定义轨迹中心的车(在这个演示乙状结肠曲线)
x = linspace (7500);
卡里= (1. / (1 + exp (- x)) * roadWidth - roadWidth / 2) * 5;%假定道路集中在y = 0
carX = linspace(-150、1150、元素个数(x));%的车将轴外的开始和结束
%绘制道路
无花果=图();
fig.Position (3:4) = (1180、420);
fig.Resize =“关闭”;%禁用无花果自车大小取决于轴大小调整。
movegui(图)
ax =轴(图,“XLim”(1100),“YLim”[8],“XTick”0:200:1000,“ytick”八8,“单位”,“像素”);
框(ax,“上”)
(ax,“上”)
rightEdge =情节(xlim (ax) roadWidth. / (2, 2),“k -”,“线宽”5);
输入leftEdge =情节(xlim (ax) roadWidth. / (2, 2),“k -”,“线宽”5);
输入leftEdge =情节(xlim (ax) [0 0),“k——”,“线宽”3);
%添加轨迹路径
traj =情节(carX卡里,“——”,“线宽”3,“颜色”[0.9375 0.5 0.5]);% lightcoral
%计算汽车基于指定宽度长度和长宽比
% xlim和ylim必须设置在此之前。轴和纵横比不能改变后的数据!
drawnow ()
暂停(0。)
asScalingFactor = (ax.DataAspectRatio (1) / ax.DataAspectRatio (2)) /…
(ax.PlotBoxAspectRatio (1) / ax.PlotBoxAspectRatio (2));
carLength = carWidth * carLenghtFactor * asScalingFactor;
%计算的左下角rectanlge每一点的轨迹
carXi = carX (:) - carLength / 2;%(左、右)
carYi =卡里(:)- carWidth / 2;%(低,上)
%画汽车起点&动画轨迹
carRect =矩形(ax,“位置”,(carXi (1) carYi (1) carLength, carWidth),…
“线宽”2,“EdgeColor”,“b”);
为i = 1:尺寸(carXi, 1)
carRect.Position (1:2) = (carXi(我),carYi (i)];
drawnow;
%暂停(1);% < - - - - - -慢下来动画
结束