存储MATLAB 3D视口

5
我正在使用MATLAB显示3D数据。我使用GUI来更改视角、缩放和平移。我如何存储这个视图并稍后将其应用于另一个图形(包含大致相同的数据)?view给我一个矩阵,但是我如何将其应用于另一个图形?
非常感谢!
3个回答

5

如果您想在另一个图表中使用当前视角,可以执行以下操作:

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

或者,您可以使用视图属性的getset方式来实现相同的效果。
然而,要一次应用您提到的所有视图属性,最简单的方法是使用Matlab内置的“生成m文件”选项 - 当您将3D图形设置为所需状态后,转到文件->生成m文件,将创建一个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

要储存和应用视图,请参考Itamar的回答

对于缩放和平移,您只需要储存轴限制。使用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)

顺便说一下,除了Itamar的答案之外,你可以将所有轴属性一次性放入一个结构体中:
ax_properties = get(gca);

移除您不想应用于新轴的字段,然后使用SET:

set(new_axes_handle,ax_properties)

请注意,结构体中也包含UserData字段。请先删除此字段。您可以使用以下代码进行操作:

rmfield(ax_properties,'UserData')

1

哇,手动调整和生成 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');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接