2015-12-02 4 views
1

До сих пор у меня есть 3D-сюжет, который обновляется в реальном времени во время моделирования Monto-Carlo Kessel Run. Я хочу, чтобы график вращался при обновлении, но с флагом rotate3d, когда я вызываю drawnow после обновления данных графика, он сбрасывает поворот осей в соответствии с ориентацией по умолчанию, отменяя то, к чему пользователь изменил его. Мой соответствующий код выглядит следующим образом:Обновление участка при сохранении вращения осей?

s = scatter3(pg(:,1), pg(:,2), pg(:,3), 'O', 'filled'); 
set(s, 'MarkerEdgeColor', 'none', 'MarkerFaceColor', 'k'); 

hold on 

p_x = curr_path(:,1); 
p_y = curr_path(:,2); 
p_z = curr_path(:,3); 

p = plot3(p_x, p_y, p_z); 
set(p, 'LineWidth', 2, 'Color', 'k'); 

p_x = longest.path(:,1); 
p_y = longest.path(:,2); 
p_z = longest.path(:,3); 

p = plot3(p_x, p_y, p_z); 
set(p, 'LineWidth', 2, 'Color', 'r'); 

p_x = shortest.path(:,1); 
p_y = shortest.path(:,2); 
p_z = shortest.path(:,3); 

p = plot3(p_x, p_y, p_z); 
set(p, 'LineWidth', 2, 'Color', 'b'); 

sample_str = sprintf('%d samples', sample); 
short_str = sprintf('shortest: %g parsecs', shortest.dist); 
long_str = sprintf('longest: %g parsecs', longest.dist); 

title(sprintf('%s, %s, %s', sample_str, short_str, long_str)); 

xlim([-10 10]); 
ylim([-10 10]); 
zlim([-10 10]); 

hold off 

drawnow 

Это выполняется каждый раз, когда я обновляю данные, нарисованные на графике. Что я могу добавить, чтобы гарантировать, что вращение оси поддерживается во время обновления?

ответ

1

Надеюсь, я понял, что вы правы. Ну, вот и все!

Я полагаю, что проблема связана с использованием plot3, что, по-видимому, сбрасывает настройки представления фигуры на значения по умолчанию.

Я проверил это со следующей программой:

figure; 
x = randn(10,3); 
p = plot3(x(:,1), x(:,2), x(:,3)); 
drawnow 

pause; %// do rotations in the figure GUI, press a button when done 

x = randn(10,3); 
p = plot3(x(:,1), x(:,2), x(:,3)); %// rotations reset 
drawnow; 
pause 

Вы можете вращать фигуру, когда пауза активна, но когда пауза освобождаются и второй вызов plot3 сделал, параметры вращения сбрасывается.

Решение, которое позволяет избежать сброса, - это прямое обновление XData, YData и ZData в уже нарисованном графическом объекте. Это может быть достигнуто следующим образом:

figure; 
x = randn(10,3); 
p = plot3(x(:,1), x(:,2), x(:,3)); 
drawnow 

pause; %// do rotations in the figure GUI, press a button when done 

x = randn(10,3); 
set(p, 'XData', x(:,1), 'YData', x(:,2), 'ZData', x(:,3)); %// no reset! 
drawnow; 
pause 

Так любой код, у вас есть, используйте ручку графического объекта непосредственно обновить line properties, чтобы избежать сброса.

+0

О, это даже лучше, чем решение, с которым я только что придумал. Моя идея состояла в том, чтобы отслеживать «CameraPosition» и «CameraViewAngle» фигуры «CurrentAxes» и устанавливать эти значения обратно, какими они были до этого, но это касается проблемы гораздо более напрямую, спасибо! –

+0

@PatrickRoberts звучит так, как это может работать. Но так как вы можете избежать сбросов вообще, это, конечно, лучше. Изменение «XData' & co. является одним из моих трюков по умолчанию, которые нужно попробовать при обновлении графика или рисования в цикле :) – mikkola

0

У меня была такая же проблема, в Matlab 2015b вы можете решить эту проблему простым способом.

[az,el] = view; 
scatter3(x,y,z); 
view(az,el); 
drawnow 
Смежные вопросы