Store MATLAB 3d viewport - PullRequest
       9

Store MATLAB 3d viewport

5 голосов
/ 23 февраля 2011

Я использую MATLAB для отображения 3D-данных. Я использую графический интерфейс для изменения угла обзора, масштабирования и панорамирования. Как я могу сохранить это представление и затем применить его к другой фигуре (содержащей более или менее те же данные)? view дает мне матрицу, но как я могу применить это к другой фигуре?

Большое спасибо!

Ответы [ 3 ]

5 голосов
/ 23 февраля 2011

Чтобы использовать текущий угол обзора на другой фигуре, вы можете сделать:

% call when the source axes is the current axes
[az, el] = view; 
% call when the target axes is the current axes
view (az, el);

Или вы можете сделать то же самое, используя get и set свойства view.

Однако, чтобы применить все свойства вида, которые вы упомянули вместе, проще использовать встроенную в Matlab опцию «сгенерировать файл» - когда у вас есть трехмерная фигура, как вам нужно, перейдите к file -> Generate m-file, и будет создан m-файл, который получает 3D-данные в качестве входных данных и применяет настройки.

Другой вариант - сохранить эти соответствующие настройки самостоятельно (просто проверьте созданный m-файл):

plot3(sin(t),cos(t),t);
pba = get(gca, 'PlotBoxAspectRatio');
dar = get(gca, 'DataAspectRatio');
cva = get(gca, 'CameraViewAngle');
cuv = get(gca, 'CameraUpVector');
ct = get(gca, 'CameraTarget');
cp = get(gca, 'CameraPosition');

и затем применить его к текущим осям (при условии, что целевые оси являютсятекущий):

set(gca, 'PlotBoxAspectRatio',pba);
set(gca, 'DataAspectRatio',dar);
set(gca, 'CameraViewAngle',cva);
set(gca, 'CameraUpVector',cuv);
set(gca, 'CameraTarget',ct);
set(gca, 'CameraPosition',cp);
2 голосов
/ 23 февраля 2011

Для сохранения и применения вида см. Ответ Итамара .

Для масштабирования и панорамирования вам просто нужно сохранить пределы осей. Используйте xlim, ylim и zlim или соответствующие свойства осей (XLim и т. Д.) С get / set.

Для текущих осей для хранения пределов:

xl = xlim;
yl = ylim;
zl = zlim;

Или со свойствами осей:

xl = get(gca,'XLim');

Чтобы применить к осям на другой фигуре:

xlim(new_axes_handle,xl) % you can skip new_axes_handle for current axes
ylim(new_axes_handle,yl)
zlim(new_axes_handle,zl)

Или

set(new_axes_handle,'XLim',xl,'YLim',yl','ZLim',zl)

Кстати, в дополнение к ответу Итамара, вы можете сразу получить все свойства осей в структуре:

ax_properties = get(gca);

Удалите поля, которые вы не хотите применять к новым осям, затем используйте SET:

set(new_axes_handle,ax_properties)

Будьте осторожны, так как структура будет также содержать данные пользователя. Сначала удалите это поле. Вы можете сделать это по коду:

rmfield(ax_properties,'UserData')
1 голос
/ 29 апреля 2011

OMG, ручная настройка и опция создания M-файла - мой герой.Если бы я только знал с самого начала, что все, что мне нужно было сделать, это:

axes1 = axes('Parent',Plot_ele,'PlotBoxAspectRatio',[1 1.70454545454545 1.7],...
    'DataAspectRatio',[1 1 1],...
    'CameraViewAngle',7.48227189414101,...
    'CameraUpVector',[-0.0256575066196788 0.989185543639328 -0.144407938178721],...
    'CameraTarget',[255.013054349713 397.874703616223 449.003273637903],...
    'CameraPosition',[1445.8877301745 1407.25270740567 7151.59363497921]);
    % xlim(axes1,[0 528]); % uncomment to preserve axes x-limits
    % zlim(axes1,[0 897.6]); % uncomment to preserve axes z-limits
hold(axes1,'all');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...