当前位置: 首页 > 信息科学 >matlab局部放大

matlab局部放大

作者 curton
来源: 小木虫 650 13 举报帖子
+关注

function [Hza,Hzr]=mmzoom(arg)

% 用法:

% [Hza,Hzr] = MMZOOM 返回创建的放大坐标系和方法框的句柄

% MMZOOM DRAG 使能放大框的拖放功能

% MMZOOM RESET 取消放大框的拖放功能

% MMZOOM OFF 删除放大框

% 常用用法:画好图片后输入mmzoom,圈图片放大,可以拖动放大框到理想位置,点击figure的非主坐标

% 系区域确定;还想拖动,输入mmzoom drag;删除放大框,输入mmzoom off删除



if nargin==0%无输入参数,则为无参数

    arg = [];

end

if isempty(arg) %无参数表示放大

    Hzoom = findobj(0,'Tag','MMZOOM'); % 找之前的放大窗口,有的话删掉

    if ~isempty(Hzoom)  

        delete(Hzoom)

    end

   

    [xlim,ylim,prect] = getbox;% 获得一个矩形框

   

    if ~isempty(prect) % 区域不能为空

        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',...           % 设置原坐标系的删除函数

            '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空白区域响应此函数

      

        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'); % 得到第一个鼠标点击数据点在坐标系中的位置

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是隐藏的,但可像这里作为传入参数用,

%注意为元胞类型

% 得到一个对象的多个属性



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、varargoutmatlab局部放大
6163bdeb486111e0b58ae&690.jpg

 返回小木虫查看更多

今日热帖
  • 精华评论
猜你喜欢
下载小木虫APP
与700万科研达人随时交流
  • 二维码
  • IOS
  • 安卓