📄 zoom.m
字号:
set(ax,'CameraViewAngle',ncva);
return;
end
limits = zoom(fig,'getlimits');
case 'getmode'
state = getappdata(fig,'ZOOMFigureState');
if isempty(state)
out = 'off';
else
mode = getappdata(fig,'ZOOMFigureMode');
if isempty(mode)
out = 'on';
else
out = mode;
end
end
return
case 'on',
state = getappdata(fig,'ZOOMFigureState');
if isempty(state),
% turn off all other interactive modes
state = uiclearmode(fig,'docontext','zoom',fig,'off');
% restore button down functions for uicontrol children of the figure
uirestore(state,'uicontrols');
setappdata(fig,'ZOOMFigureState',state);
end
set(fig,'windowbuttondownfcn','zoom(gcbf,''down'')', ...
'windowbuttonupfcn','ones;', ...
'windowbuttonmotionfcn','', ...
'buttondownfcn','', ...
'interruptible','on');
set(ax,'interruptible','on');
% set an appdata so it will always be possible to
% determine whether or not zoom is on and in what
% type of 'on' state it is.
% this appdata will not exist when zoom is off
setappdata(fig,'ZoomOnState','on');
scribefiglisten(fig,'on');
doZoomIn(fig)
return
case 'inmode'
zoom(fig,'on');
doZoomIn(fig)
return
case 'outmode'
zoom(fig,'on');
doZoomOut(fig)
return
case 'reset',
axz = get(ax,'ZLabel');
if isappdata(axz,'ZOOMAxesData')
rmappdata(axz,'ZOOMAxesData');
end
return
case 'xon',
zoom(fig,'on') % Set up userprop
set(fig,'windowbuttondownfcn','zoom(gcbf,''xdown'')', ...
'windowbuttonupfcn','ones;', ...
'windowbuttonmotionfcn','','buttondownfcn','',...
'interruptible','on');
set(ax,'interruptible','on')
% set an appdata so it will always be possible to
% determine whether or not zoom is on and in what
% type of 'on' stat it is.
% this appdata will not exist when zoom is off
setappdata(fig,'ZoomOnState','xon');
return
case 'yon',
zoom(fig,'on') % Set up userprop
set(fig,'windowbuttondownfcn','zoom(gcbf,''ydown'')', ...
'windowbuttonupfcn','ones;', ...
'windowbuttonmotionfcn','','buttondownfcn','',...
'interruptible','on');
set(ax,'interruptible','on')
% set an appdata so it will always be possible to
% determine whether or not zoom is on and in what
% type of 'on' state it is.
% this appdata will not exist when zoom is off
setappdata(fig,'ZoomOnState','yon');
return
case 'out',
limits = zoom(fig,'getlimits');
center = [sum(get_xlim(ax))/2 sum(get_ylim(ax))/2];
m = -inf; % Zoom totally out
case 'getlimits', % Get axis limits
axz = get(ax,'ZLabel');
limits = getappdata(axz,'ZOOMAxesData');
% Do simple checking of userdata
if size(limits,2)==4 & size(limits,1)<=2,
if all(limits(1,[1 3])<limits(1,[2 4])),
getlimits = 0; out = limits(1,:);
return % Quick return
else
getlimits = -1; % Don't munge data
end
else
if isempty(limits)
getlimits = 1;
else
getlimits = -1;
end
end
% If I've made it to here, we need to compute appropriate axis
% limits.
if isempty(getappdata(axz,'ZOOMAxesData')),
% Use quick method if possible
xlim = get_xlim(ax); xmin = xlim(1); xmax = xlim(2);
ylim = get_ylim(ax); ymin = ylim(1); ymax = ylim(2);
elseif strcmp(get(ax,'xLimMode'),'auto') & ...
strcmp(get(ax,'yLimMode'),'auto'),
% Use automatic limits if possible
xlim = get_xlim(ax); xmin = xlim(1); xmax = xlim(2);
ylim = get_ylim(ax); ymin = ylim(1); ymax = ylim(2);
else
% Use slow method only if someone else is using the userdata
h = get(ax,'Children');
xmin = inf; xmax = -inf; ymin = inf; ymax = -inf;
for i=1:length(h),
t = get(h(i),'Type');
if ~strcmp(t,'text'),
if strcmp(t,'image'), % Determine axis limits for image
x = get(h(i),'Xdata'); y = get(h(i),'Ydata');
x = [min(min(x)) max(max(x))];
y = [min(min(y)) max(max(y))];
[ma,na] = size(get(h(i),'Cdata'));
if na>1
dx = diff(x)/(na-1);
else
dx = 1;
end
if ma>1
dy = diff(y)/(ma-1);
else
dy = 1;
end
x = x + [-dx dx]/2; y = y + [-dy dy]/2;
end
xmin = min(xmin,min(min(x)));
xmax = max(xmax,max(max(x)));
ymin = min(ymin,min(min(y)));
ymax = max(ymax,max(max(y)));
end
end
% Use automatic limits if in use (override previous calculation)
if strcmp(get(ax,'xLimMode'),'auto'),
xlim = get_xlim(ax); xmin = xlim(1); xmax = xlim(2);
end
if strcmp(get(ax,'yLimMode'),'auto'),
ylim = get_ylim(ax); ymin = ylim(1); ymax = ylim(2);
end
end
limits = [xmin xmax ymin ymax];
if getlimits~=-1, % Don't munge existing data.
% Store limits ZOOMAxesData
% store it with the ZLabel, so that it's cleared if the
% user plots again into this axis. If that happens, this
% state is cleared
axz = get(ax,'ZLabel');
setappdata(axz,'ZOOMAxesData',limits);
end
out = limits;
return
case 'getconnect', % Get connected axes
axz = get(ax,'ZLabel');
limits = getappdata(axz,'ZOOMAxesData');
if all(size(limits)==[2 4]), % Do simple checking
out = limits(2,[1 2]);
else
out = [ax ax];
end
return
case 'fill',
old_view = get(ax,'view');
view(45,45);
set(ax,'CameraViewAngleMode','auto');
set(ax,'CameraViewAngle',get(ax,'CameraViewAngle'));
view(old_view);
return
otherwise
error(['Unknown option: ',zoomCommand,'.']);
end
%---------------------------------------------------------------------------------%
%
% Actual zoom operation
%
if ~rbbox_mode,
xmin = limits(1); xmax = limits(2);
ymin = limits(3); ymax = limits(4);
if m==(-inf),
dx = xmax-xmin;
dy = ymax-ymin;
else
dx = diff(get_xlim(ax))*(scale_factor.^(-m-1)); dx = min(dx,xmax-xmin);
dy = diff(get_ylim(ax))*(scale_factor.^(-m-1)); dy = min(dy,ymax-ymin);
end
% Limit zoom.
center = max(center,[xmin ymin] + [dx dy]);
center = min(center,[xmax ymax] - [dx dy]);
a = [max(xmin,center(1)-dx) min(xmax,center(1)+dx) ...
max(ymin,center(2)-dy) min(ymax,center(2)+dy)];
% Check for log axes and return to linear values.
if strcmp(get(ax,'XScale'),'log'),
a(1:2) = 10.^a(1:2);
end
if strcmp(get(ax,'YScale'),'log'),
a(3:4) = 10.^a(3:4);
end
end
% Check for axis equal and update a as necessary
if strcmp(get(ax,'plotboxaspectratiomode'),'manual') & ...
strcmp(get(ax,'dataaspectratiomode'),'manual')
ratio = get(ax,'plotboxaspectratio')./get(ax,'dataaspectratio');
dx = a(2)-a(1);
dy = a(4)-a(3);
[kmax,k] = max([dx dy]./ratio(1:2));
if k==1
dy = kmax*ratio(2);
a(3:4) = mean(a(3:4))+[-dy dy]/2;
else
dx = kmax*ratio(1);
a(1:2) = mean(a(1:2))+[-dx dx]/2;
end
end
% Update circular list of connected axes
list = zoom(fig,'getconnect'); % Circular list of connected axes.
if zoomx,
if a(1)==a(2), return, end % Short circuit if zoom is moot.
set(ax,'xlim',a(1:2))
h = list(1);
while h ~= ax,
set(h,'xlim',a(1:2))
% Get next axes in the list
hz = get(h,'ZLabel');
next = getappdata(hz,'ZOOMAxesData');
if all(size(next)==[2 4]), h = next(2,1); else h = ax; end
end
end
if zoomy,
if a(3)==a(4), return, end % Short circuit if zoom is moot.
set(ax,'ylim',a(3:4))
h = list(2);
while h ~= ax,
set(h,'ylim',a(3:4))
% Get next axes in the list
hz = get(h,'ZLabel');
next = getappdata(hz,'ZOOMAxesData');
if all(size(next)==[2 4]), h = next(2,2); else h = ax; end
end
end
%----------------------------------------------------------------------------------%
%
% Helper Functions
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function p = get_currentpoint(ax)
%GET_CURRENTPOINT Return equivalent linear scale current point
p = get(ax,'currentpoint'); p = p(1,1:2);
if strcmp(get(ax,'XScale'),'log'),
p(1) = log10(p(1));
end
if strcmp(get(ax,'YScale'),'log'),
p(2) = log10(p(2));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function xlim = get_xlim(ax)
%GET_XLIM Return equivalent linear scale xlim
xlim = get(ax,'xlim');
if strcmp(get(ax,'XScale'),'log'),
xlim = log10(xlim);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function ylim = get_ylim(ax)
%GET_YLIM Return equivalent linear scale ylim
ylim = get(ax,'ylim');
if strcmp(get(ax,'YScale'),'log'),
ylim = log10(ylim);
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function doZoomIn(fig)
set(findall(fig,'Tag','figToolZoomIn'),'State','on');
set(findall(fig,'Tag','figToolZoomOut'),'State','off');
setappdata(fig,'ZOOMFigureMode','in');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function doZoomOut(fig)
set(findall(fig,'Tag','figToolZoomIn'),'State','off');
set(findall(fig,'Tag','figToolZoomOut'),'State','on');
setappdata(fig,'ZOOMFigureMode','out');
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function doZoomOff(fig)
set(findall(fig,'Tag','figToolZoomIn'),'State','off');
set(findall(fig,'Tag','figToolZoomOut'),'State','off');
if ~isempty(getappdata(fig,'ZoomFigureMode'))
rmappdata(fig,'ZOOMFigureMode');
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -