如何将图像添加到情节,根据x, y coordinatates ?

93(30天)
我有一个脚本,使得这些矩形框,显示了运动车辆在路上。我想添加一个图像的一辆车,这样我可以叠加在矩形框。我输入了x, y和偏航坐标。

接受的答案

亚当Danz
亚当Danz 2021年5月12日
编辑:亚当Danz 2021年5月12日
演示1 显示动画的一辆车, 演示2 显示了一个矩形的动画。
也看到 这个答案 是一辆卡车穿过一座桥。
示例1:汽车图像
这个演示展示了如何
  1. 汽车的任何选择图像加载到Matlab。
  2. 规模的汽车图像,维护一个广场长宽比不影响数据比例或轴的大小。
  3. 定义一个汽车图像的中心将遵循的轨迹
  4. 动画汽车的轨迹——动画只描述了翻译,没有改变方向,但你可以添加一个旋转矩阵来实现,如果你的愿望。
首先,选择任何一辆车的形象,但最好是有一个透明的背景和填充整个图像空间。我没有在我的汽车图像文件版权的目的。
%读汽车形象
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);% < - - - - - -慢下来动画
结束
3评论

登录置评。

更多的答案(0)

类别

找到更多的在动画帮助中心文件交换

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!