我对在Matlab中实现绘制3D点的最佳方法感到困惑。我的一个想法是继续更新x,y,z值的数组,然后绘制它,但是我希望它能实时绘制,因为我正在为项目使用LiDAR扫描仪,并希望显示正在创建的3D地图。这是我一直在尝试的示例:
x = rand(10,1) ; y = rand(10,1) ;
h = scatter(x,y,'Or') ;
for i = 1:100
x = rand(10,1)
y = rand(10,1) ;
set(h,'XData',x,'YData',y) ;
drawnow
pause(0.1)
end
我对此有一个问题,当我继续添加Z值时,它仍然存在。即使在3D模式下,绘图也能正常工作,但是循环的每次迭代都会删除所有先前的点,然后将其替换为新的点。在制作地图时,我需要以最高的效率维护这些点。
所以,我想知道是否有一种实时绘制方法,而不必一遍又一遍地绘制整个事物,而只是将这些点“附加”到3D平面上。如果没有,我想知道如何修复我的代码,以使这些点不会被替换。
答案 0 :(得分:3)
使用set(h,'XData',x,'YData',y) ;
代替hold on
,使用新图解可以使您在平面上附加一些内容,因此下面的代码可能有效:
x = rand(10,1) ; y = rand(10,1) ;
h = scatter(x,y,'Or') ;
hold on % allow appending
for i = 1:100
x = rand(10,1)
y = rand(10,1) ;
h = scatter(x,y,'Or') ; %draw new points
% set(h,'XData',x,'YData',y) ;
drawnow
pause(0.1)
end
但是强烈建议保留所有数据,例如将新统计信息保存在旧数据之后的新列中:
[x,y] = deal(zeros(10,100)); %pre-allocate
figure(1); hold on
for ii = 1:100
x(:,ii)=rand(10,1); %save new x
y(:,ii)=rand(10,1); %save new y
scatter(x(:,ii),y(:,ii),'Or') ; %plot them
drawnow
pause(0.1)
end
此外,当我们需要通过处理手柄进一步编辑图形时,hold on
有时会有缺点,因为每十个点将具有唯一的手柄。为了将它们保持一体,我认为如果我们没有太多数据要绘制,对代码进行较小的更改可能是一个更好的解决方案(它要求重新允许RAM中的向量,``清理''图形并重新绘制所有图形)点,包括那些旧点,一次又一次)。
x = rand(10,1) ; y = rand(10,1) ;
h = scatter(x,y,'Or') ;
for i = 1:100
x(end+1:end+10) = rand(10,1) ; % append x
y(end+1:end+10) = rand(10,1) ; % append y
set(h,'XData',x,'YData',y) ; % draw new figure
drawnow
pause(0.1)
end