Как построить 3D-точки в реальном времени в Matlab? - PullRequest
0 голосов
/ 25 декабря 2018

Я запутался в том, как лучше всего реализовать построение трехмерных точек в прямом эфире в Matlab.У меня была одна идея - обновлять массив значений 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, но затем каждая итерация цикла удаляет все предыдущие точки, а затем заменяет их новыми точками.Поскольку я делаю карту, мне нужно, чтобы точки сохранялись с максимальной эффективностью.

Итак, мне интересно, есть ли способ построить график в режиме реального времени без необходимости рисовать всю вещь снова и снова, вместо этого просто «добавляя» точки на трехмерную плоскость.Если нет, я бы хотел знать, как исправить мой код, чтобы точки не заменялись.

1 Ответ

0 голосов
/ 25 декабря 2018

Вместо 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 есть недостаток, когда нам нужно дополнительно редактировать фигуру, имея дело с ручкой, как каждые десять пунктовбудет иметь уникальную ручку.Чтобы сохранить их все в одном, я думаю, что небольшое изменение в вашем коде может быть лучшим решением, если у нас не слишком много данных для построения графика (требуется повторное разрешение векторов в ОЗУ, «очистка» фигуры и повторное построение всехточки, в том числе старые, снова и снова).

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...