如何在Matlab中实时绘制3D点?

时间:2018-12-25 04:36:57

标签: matlab

我对在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平面上。如果没有,我想知道如何修复我的代码,以使这些点不会被替换。

1 个答案:

答案 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