matlab局部放大
function [Hza,Hzr]=mmzoom(arg)
% 用法:
% [Hza,Hzr] = MMZOOM 返回創(chuàng)建的放大坐標系和方法框的句柄
% MMZOOM DRAG 使能放大框的拖放功能
% MMZOOM RESET 取消放大框的拖放功能
% MMZOOM OFF 刪除放大框
% 常用用法:畫好圖片后輸入mmzoom,圈圖片放大,可以拖動放大框到理想位置,點擊figure的非主坐標
% 系區(qū)域確定;還想拖動,輸入mmzoom drag;刪除放大框,輸入mmzoom off刪除
if nargin==0%無輸入?yún)?shù),則為無參數(shù)
arg = [];
end
if isempty(arg) %無參數(shù)表示放大
Hzoom = findobj(0,'Tag','MMZOOM'); % 找之前的放大窗口,有的話刪掉
if ~isempty(Hzoom)
delete(Hzoom)
end
[xlim,ylim,prect] = getbox;% 獲得一個矩形框
if ~isempty(prect) % 區(qū)域不能為空
Haxes = gca;
Hzr = rectangle('Position',prect,...%畫矩形框
'Linestyle',':',...
'Tag','MMZOOM');
Hfig = gcf;
Hzoom = copyobj(Haxes,Hfig); %復制一個坐標系到當前窗口
OldUnits = get(Haxes,'Units'); %得到坐標系的單位
set(Haxes,'Units','normalized') %設置坐標系的單位
Pvect = get(Haxes,'Position');
set(Haxes,'Units',OldUnits)
alpha = 1/3; %放大窗口縮放比例
beta = 98/100; %放大窗口偏移
Zwidth = alpha*Pvect(3);
Zheight = alpha*Pvect(4);
Zleft = Pvect(1)+beta*Pvect(3)-Zwidth;
Zbottom = Pvect(2)+beta*Pvect(4)-Zheight;
set(Hzoom,'units','Normalized',... % make units normalized
'Position',[Zleft Zbottom Zwidth Zheight],...% axes position
'Xlim',xlim,'Ylim',ylim,... % axis data limits
'Box','on',... % axis box on
'Xgrid','off','Ygrid','off',... % grid lines off
'FontUnits','points',...
'FontSize',8,... % shrink font size
'ButtonDownFcn','selectmoveresize',... % 設置放大坐標系可拖動和縮放
'Tag','MMZOOM',... % tag zoomed axes
'UserData',Haxes) % store original axes
[Htx,Hty,Htt] = getn(Hzoom,'Xlabel','Ylabel','Title');%得到多個屬性的句柄
set([Htx,Hty,Htt],'String','')%設置相應的句柄string屬性為空
set(Haxes,'DeleteFcn',... % 設置原坐標系的刪除函數(shù)
'delete(findobj(0,''Type'',''axes'',''Tag'',''MMZOOM''))')
Hchild = findobj(Hfig,'type','axes');
Hchild(Hchild==Hzoom) = [];
set(Hfig,'Children',[Hzoom;Hchild],...%將放大的坐標系放在棧頂
'CurrentAxes',Haxes,... %使原坐標系為當前坐標系,如果再畫圖將在當前坐標系繪圖
'ButtonDownFcn','mmzoom reset') %點擊figure空白區(qū)域響應此函數(shù)
if nargout>=1
Hza = Hzoom;
end
end
elseif strncmpi(arg,'d',1) %使能拖動放大框
Hzoom = findobj(0,'Type','axes','Tag','MMZOOM');
if ~isempty(Hzoom)
set(Hzoom,'ButtonDownFcn','selectmoveresize')%設置放大框可拖動
end
elseif strncmpi(arg,'r',1) %使放大框不能再被拖動
Hzoom = findobj(0,'Type','axes','Tag','MMZOOM');
if ~isempty(Hzoom)
[Hfig,Haxes] = getn(Hzoom,'Parent','UserData');
set(Hzoom,'ButtonDownFcn','','Selected','off')
set(Hfig,'CurrentAxes',Haxes)
end
elseif strncmpi(arg,'o',1) %刪除放大框
Hzoom = findobj(0,'Tag','MMZOOM');
if ~isempty(Hzoom)
delete(Hzoom)
end
else
error('Unknown Input Argument.')
end
%%%%%%%%%%%%%%%%
function [xbox,ybox,prect]=getbox
if waitforbuttonpress %等待鼠標按下,按下鼠標返回False,按下按鍵返回True
return
end
Hf = gcf; % 得到鼠標點擊的窗口
Ha = gca(Hf); % 得到鼠標點擊的坐標系
AxesPt = get(Ha,'CurrentPoint'); % 得到第一個鼠標點擊數(shù)據(jù)點在坐標系中的位置
FigPt = get(Hf,'CurrentPoint'); % 坐標軸的CurrentPoint值為一個2*3的矩陣,第一行為離觀察者最
%近的點的三維坐標,第2行為離觀察者最遠的點的三維坐標。默認的視角View = 90度的情況下,這兩行的
%x和y坐標是相同的。一般情況下,只需要取pos第1行的前兩個元素,第3個元素為z軸坐標,一般不用。
rbbox([FigPt 0 0],FigPt) % 用鼠標圈出矩形框,鼠標松開時返回
AxesPt = [AxesPt;get(Ha,'CurrentPoint')];%組合起始點和終止點
[Xlim,Ylim] = getn(Ha,'Xlim','Ylim');%得到一個對象的多個屬性的句柄
xbox = [min(AxesPt(:,1)) max(AxesPt(:,1))]; %得到所畫矩形框兩角點的橫坐標
xbox = [max(xbox(1),Xlim(1)) min(xbox(2),Xlim(2))]; %點不能在邊界外
ybox = [min(AxesPt(:,2)) max(AxesPt(:,2))];
ybox = [max(ybox(1),Ylim(1)) min(ybox(2),Ylim(2))];
prect = [xbox(1) ybox(1) diff(xbox) diff(ybox)];
%%%%%%%%%%%%%%%%
function varargout=getn(H,varargin)%一般varargin和varargout是隱藏的,但可像這里作為傳入?yún)?shù)用,
%注意為元胞類型
% 得到一個對象的多個屬性
if max(size(H))~=1 || ~ishandle(H)
error('Scalar Object Handle Required.')
end
varargout=get(H,varargin);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
學到的知識:
findobj
rectangle
copyobj
'ButtonDownFcn','selectmoveresize'
'CurrentAxes'
'Children'
waitforbuttonpress
%%%%%%%%%%%%%%%%matlab示例:
w = waitforbuttonpress;
if w == 0
disp('Button click')
else
disp('Key press')
end
%%%%%%%%%%%%%%%%
'CurrentPoint'
rbbox
%%%%%%%%%%%%%%%%matlab示例:
k = waitforbuttonpress;
point1 = get(gca,'CurrentPoint'); % button down detected
finalRect = rbbox; % return figure units
point2 = get(gca,'CurrentPoint'); % button up detected
point1 = point1(1,1:2); % extract x and y
point2 = point2(1,1:2);
p1 = min(point1,point2); % calculate locations
offset = abs(point1-point2); % and dimensions
x = [p1(1) p1(1)+offset(1) p1(1)+offset(1) p1(1) p1(1)];
y = [p1(2) p1(2) p1(2)+offset(2) p1(2)+offset(2) p1(2)];
hold on
axis manual
plot(x,y) % redraw in dataspace units
%%%%%%%%%%%%%%%%
varargin、varargout
6163bdeb486111e0b58ae&690.jpg

京公網(wǎng)安備 11010802022153號
頂一下,感謝分享,
頂一下,感謝分享!
頂一下,感謝分享!
頂一下,感謝分享!
頂一下,感謝分享!
頂一下,感謝分享!
頂一下,感謝分享!