www.gusucode.com > wavelet工具箱matlab源码程序 > wavelet/wavelet/dw2darro.m

    function dw2darro(option,win_dw2dtool,in3,in4)
%DW2DARRO Discrete wavelet 2-D arrows.
%   DW2DARRO(OPTION,WIN_DW2DTOOL,IN3,IN4)

%   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
%   Last Revision 08-May-2012.
%   Copyright 1995-2012 The MathWorks, Inc.

% Tag property of objects.
%-------------------------
tag_axearrow  = 'Axe_Arrow';
tag_axeimgini = 'Axe_ImgIni';
tag_axeimgvis = 'Axe_ImgVis';
tag_axeimgsel = 'Axe_ImgSel';
% tag_axeimgdec = 'Axe_ImgDec';
tag_axeimgsyn = 'Axe_ImgSyn';
tag_arrow     = 'Wave_Arrow';

axe_handles = findobj(get(win_dw2dtool,'Children'),'flat','Type','axes');
arrow_hdls  = findobj(axe_handles,'Tag',tag_arrow);

if isequal(option,'ini_arrow') || isequal(option,'set_arrow')
    dw2d_PREFS = wtbutils('dw2d_PREFS');
    Col_BoxTitleSel = dw2d_PREFS.Col_BoxTitleSel;
    Col_ArrowFrm    = dw2d_PREFS.Col_ArrowFrm;
    Col_ArrowTxt    = dw2d_PREFS.Col_ArrowTxt;
end

switch option
    case 'ini_arrow'
        fontsize = wmachdep('FontSize','normal',20);
        axe_arrow = axes(...
            'Parent',win_dw2dtool,    ...
            'Position',[0 0 1 1],     ...
            'XLim',[0 1],'YLim',[0 1],...
            'NextPlot','Add',         ...
            'Visible','off',          ...
            'Tag',tag_axearrow        ...
            );
        ar0 = wavarrow('ini',axe_arrow,2,Col_ArrowFrm);
        set(ar0,'UserData','a0');
        ar1 = wavarrow('ini',axe_arrow,2,Col_ArrowFrm);
        set(ar1,'UserData','a1');
        commonProp = {...
            'Parent',axe_arrow,             ...
            'Units','normalized',           ...
            'Visible','off',                ...
            'HorizontalAlignment','center', ...
            'FontSize',fontsize,            ...
            'FontWeight','bold',            ...
            'Color',Col_ArrowTxt,           ...
            'Tag',tag_arrow                 ...
            };
        locProp = {commonProp{:},'String','dwt','UserData','t0'};
        text(locProp{:});
        ar2 = wavarrow('ini',axe_arrow,2,Col_BoxTitleSel);
        set(ar2,'UserData','a2');
        ar3 = wavarrow('ini',axe_arrow,2,Col_ArrowFrm);
        set(ar3,'UserData','a3');
        locProp = {commonProp{:},'String','idwt','UserData','t31'};
        text(locProp{:});
        locProp = {commonProp{:},'String','','UserData','t32'};
        text(locProp{:});

    case 'vis_arrow'
        % in3 = 'on' or 'off'
        % in4 optional (return_deno or return_comp)
        %------------------------------------------             
        txt = get(findobj(arrow_hdls,'UserData','t0'),'String');
        if strcmp(txt,'dwt')
            ar = findobj(arrow_hdls,'UserData','a1');
        else
            ar = findobj(arrow_hdls,'UserData','a0');
        end
        arrow_hdls = arrow_hdls(arrow_hdls~=ar);
        if nargin==4
            txt = findobj(arrow_hdls,'UserData','t32');
            set(txt,'String',in4);
        end             
        set(arrow_hdls,'Visible',in3);

    case 'clean'
        % in3 = 'on' or 'off'
        %--------------------          
        txt = get(findobj(arrow_hdls,'UserData','t0'),'String');
        if strcmp(txt,'dwt')
            ar = findobj(arrow_hdls,'UserData','a1');
        else
            ar = findobj(arrow_hdls,'UserData','a0');
        end
        arrow_hdls = arrow_hdls(arrow_hdls~=ar);
        txt = findobj(arrow_hdls,'UserData','t32');
        set(txt,'String','');
        set(arrow_hdls,'Visible',in3);

    case 'set_arrow'
        % in3 calling option
        %-------------------
        Axe_ImgIni = findobj(axe_handles,'flat','Tag',tag_axeimgini);
        Axe_ImgSel = findobj(axe_handles,'flat','Tag',tag_axeimgsel);
        Axe_ImgVis = findobj(axe_handles,'flat','Tag',tag_axeimgvis);
        Axe_ImgSyn = findobj(axe_handles,'flat','Tag',tag_axeimgsyn);
        ar0 = findobj(arrow_hdls,'UserData','a0');
        ar1 = findobj(arrow_hdls,'UserData','a1');
        ar2 = findobj(arrow_hdls,'UserData','a2');
        ar3 = findobj(arrow_hdls,'UserData','a3');
        t0  = findobj(arrow_hdls,'UserData','t0');
        t31 = findobj(arrow_hdls,'UserData','t31');
        t32 = findobj(arrow_hdls,'UserData','t32');

        pini = get(Axe_ImgIni,'Position');
        psel = get(Axe_ImgSel,'Position');
        pvis = get(Axe_ImgVis,'Position');
        psyn = get(Axe_ImgSyn,'Position');
        [bdx,bdy] = wfigutil('prop_size',win_dw2dtool,15,15);
        mul = 1/6;
        xini = pini(1)+pini(3);
        yini = pini(2);
        xsel = psel(1)-bdx;
        ysel = psel(2)+psel(4)+bdy;
        dx = xsel-xini;
        dy = yini-ysel;
        pt1 = [xini+mul*dx yini-mul*dy];
        pt2 = [xsel-mul*dx ysel+mul*dy];
        wavarrow('set',ar0,pt1,pt2,0.6,2,Col_ArrowFrm,'off');
        wavarrow('set',ar1,pt2,pt1,0.6,2,Col_ArrowFrm,'off');
        if strcmp(in3,'load_cfs')
            ar00 = ar1;
            txt = 'idwt';
        else
            ar00 = ar0;
            txt = 'dwt';
        end 
        set(t0,'Position',[xini+dx/2 yini-dy/2],'String',txt);

        xvis = pvis(1)+pvis(3)/2;
        yvis = pvis(2);
        ysel = psel(2)+psel(4)+bdy+bdy/2;
        dy   = yvis-ysel;
        wavarrow('set',ar2,[xvis ysel+mul*dy],[xvis yvis-mul*dy], ...
                                0.6,2,Col_BoxTitleSel,'off');

        xsyn = psyn(1)+psyn(3);
        ysyn = psyn(2)+psyn(4)/2;
        dx   = xsel-xsyn;
        wavarrow('set',ar3,[xsel-mul*dx ysyn],[xsyn+mul*dx ysyn], ...
                                0.6,2,Col_ArrowFrm,'off');
        set(t31,'Position',[xsel-dx/2 ysyn+0.025],'String','idwt');
        set(t32,'Position',[xsel-dx/2 ysyn-0.02],'String','');
        set([ar00 ar2 ar3 t0 t31],'Visible','on');

    case 'del_arrow'
        delete(arrow_hdls)

    otherwise
        errargt(mfilename,getWavMSG('Wavelet:moreMSGRF:Unknown_Opt'),'msg');
        error(message('Wavelet:FunctionArgVal:Invalid_Input'));
end

%=================================================================%
function out1 = wavarrow(option,in2,in3,in4,in5,in6,in7,in8)
%WAVARROW Draw arrows and texts for dw2dtool.
%   out1 = wavarrow(option,in2,in3,in4,in5,in6,in7,in8)

tag_arrow = 'Wave_Arrow';
opt     = option(1:3);

switch opt
    case 'ini'
      axe     = in2;
      width   = in3;
      color   = in4;
      out1 = line(...
              'Parent',axe,...
              'XData',[0 0],'YData',[1 1],...
              'LineWidth',width,'Color',color,...
              'Visible','off','Tag',tag_arrow);

    case 'cre'
      axe     = in2;
      start   = in3;
      stop    = in4;
      scale   = in5;
      width   = in6;
      color   = in7;
      if nargin<8 , vis = 'on'; else vis = in8; end
      if isempty(stop==start) , return; end
      xdif = stop(1) - start(1);
      ydif = stop(2) - start(2);
      if      xdif~=0 , theta = atan(ydif/xdif);
      elseif  ydif>0  , theta = pi/2;
      elseif  ydif<0  , theta = -pi/2;
      end
      if(xdif>=0) , scale = -scale; end
      xx = [  start(1), stop(1),                                 ...
              (stop(1)+0.02*scale*cos(theta+pi/6)),NaN,stop(1),  ...
              (stop(1)+0.02*scale*cos(theta-pi/6))]';
      yy = [  start(2), stop(2),                                 ...
              (stop(2)+0.02*scale*sin(theta+pi/6)),NaN,stop(2),  ...
              (stop(2)+0.02*scale*sin(theta-pi/6))]';
      out1 = line(...
              'Parent',axe,...
              'XData',xx,'YData',yy,...
              'LineWidth',width,'Color',color,...
              'Visible',vis,'Tag',tag_arrow);

    case 'set'
      arrow   = in2;
      start   = in3;
      stop    = in4;
      scale   = in5;
      width   = in6;
      color   = in7;
      if nargin<8 , vis = 'on'; else vis = in8; end
      if isempty(stop==start) , return; end
      xdif = stop(1) - start(1);
      ydif = stop(2) - start(2);
      if      xdif~=0 , theta = atan(ydif/xdif);
      elseif  ydif>0  , theta = pi/2;
      elseif  ydif<0  , theta = -pi/2;
      end
      if(xdif>=0) , scale = -scale; end
      xx = [  start(1), stop(1),                                      ...
              (stop(1)+0.02*scale*cos(theta+pi/6)),NaN,stop(1),       ...
              (stop(1)+0.02*scale*cos(theta-pi/6))]';
      yy = [  start(2), stop(2),                                      ...
              (stop(2)+0.02*scale*sin(theta+pi/6)),NaN,stop(2),       ...
              (stop(2)+0.02*scale*sin(theta-pi/6))]';
      set(arrow,'XData',xx,'YData',yy,'LineWidth',width,'Color',color,...
                              'Visible',vis,'Tag',tag_arrow);

    case 'vis' , set(in2,'Visible',in3);
    case 'wid' , set(in2,'LineWidth',in3);
    case 'col' , set(in2,'Color',in3);

    otherwise
        errargt(mfilename,getWavMSG('Wavelet:moreMSGRF:Unknown_Opt'),'msg');
        error(message('Wavelet:FunctionArgVal:Invalid_Input'));
end
%=================================================================%