wtbarrow.m
上传用户:haiyisale
上传日期:2013-01-09
资源大小:3246k
文件大小:9k
源码类别:

波变换

开发平台:

Matlab

  1. function HDL = wtbarrow(option,varargin)
  2. %WTBARROW Create Arrows.
  3. %
  4. %  example:
  5. %       hdl = wtbarrow('create');
  6. %       set(gca,'Xlim',[0,1],'Ylim',[0,1]);
  7. %       pause
  8. %       hdl = wtbarrow('create','Rotation',pi/2,'Scale',[0.5 0.5],'Color','b');
  9. %       set(gca,'Xlim',[-2,2],'Ylim',[-2,2]);
  10. %       pause
  11. %       hdl = wtbarrow('create','Translate',[1,0],'Rotation',pi/4,'Scale',[0.5 0.5],'Color','y');
  12. % Copyright 2003 The MathWorks, Inc.
  13. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 10-Feb-2003.
  14. %   Last Revision: 06-Mar-2003.
  15. if nargin<1 , option = 'create'; end
  16. % Defaults.
  17. %------------
  18. sca = ones(1,2);        
  19. rot = 0;
  20. tra = zeros(1,2);  
  21. nbarg  = length(varargin);
  22. switch option
  23.     case {'create','createBIS','createTER'}
  24.         % ------------------------------------------
  25.         % Arrow construction.
  26.         % ------------------------------------------
  27.         %          x             H = HArrow
  28.         %     <------------> <------->
  29.         %                    =             ^
  30.         %                    ===           |  W = WArrow
  31.         %                    ====          v
  32.         %     ====================      ^
  33.         %     ======================    |
  34.         %     ========================  |  2*E
  35.         %     ======================    |
  36.         %     ====================      v
  37.         %                    ====
  38.         %                    ===
  39.         %                    =
  40.         % ALFA is the angle of the arrow head
  41.         % or W = WArrow.
  42.         % Z = E + W;
  43.         % ------------------------------------------
  44.         
  45.         % defaults.
  46.         %----------
  47.         axe = gca;
  48.         vis = 'On';
  49.         col = [1 0 0]; 
  50.        %-------------
  51.         alf = pi/4;
  52.         W   = NaN;
  53.         xP1 = 3/4;
  54.         H   = 1/4;
  55.         E   = 1/8;
  56.         %-----------
  57.         xP2 = 2*xP1;
  58.         dY1 = 1/2;
  59.         %------------          
  60.         for k = 1:2:nbarg
  61.             argType = varargin{k};
  62.             argVal  = varargin{k+1};
  63.             argType = lower(argType(1:3));
  64.             switch argType
  65.                 case 'axe' , axe = argVal;
  66.                 case 'vis' , vis = argVal;
  67.                 case 'col' , col = argVal; 
  68.                 %------------------------
  69.                 case 'alf' , alf = argVal;
  70.                 case 'xp1' , xP1 = argVal;
  71.                 case 'xp2' , xP2 = argVal;    
  72.                 case 'har' , H   = argVal;
  73.                 case 'war' , W   = argVal;                    
  74.                 case 'wid' , E   = argVal;
  75.                 case 'hy1'  ,HY1 = argVal;
  76.                 %------------------------       
  77.                 case 'sca' , sca = argVal;        
  78.                 case 'rot' , rot = argVal;
  79.                 case 'tra' , tra = argVal;
  80.             end
  81.         end
  82.         if isnan(W)
  83.             Z =  tan(alf)*H;
  84.             W = max(Z-E,0);
  85.         end
  86.         Z  = E + W;
  87.         switch option
  88.             case 'create'
  89.                 ArrowData = [...
  90.                   0  xP1  xP1 xP1+H xP1 xP1 0  0; ...
  91.                  -E  -E   -Z     0   Z   E  E -E ...
  92.                     ];
  93.             case 'createBIS'
  94.                 V  = HY1-H;
  95.                 y1 = -(E+HY1);
  96.                 y2 = y1+V;
  97.                 Xd = [0 2*E  2*E  xP1-E  xP1-E  xP1+E  xP1+E  xP2-E  xP2-E  xP2-Z  xP2   xP2+E+W  xP2+E  xP2+E  0   0];
  98.                 Yd = [y1 y1  -E    -E     y1      y1     -E    -E     y2      y2    y1      y2      y1+V   E    E  y1];
  99.                 ArrowData = [Xd ; Yd];
  100.                 
  101.             case 'createTER'
  102.                 V  = HY1-H;
  103.                 y1 = -(E+HY1);
  104.                 y2 = y1+V;
  105.                 Xd = [0 2*E  2*E  xP1-E  xP1-E  xP1+E  xP1+E  xP2-E  xP2-E  xP2-Z  xP2   xP2+E+W  xP2+E  xP2+E  0   0];
  106.                 Yd = [y1 y1  -E    -E     y1      y1     -E    -E     y2      y2    y1      y2      y1+V   E    E  y1];
  107.                 N = 10;
  108.                 xx = linspace(2*E,xP1-E,N);
  109.                 t  = linspace(0,1,10);
  110.                 yy = y1 +  HY1*4*t.*(1-t);
  111.                 Xd = [Xd(1:2) xx Xd(5:end)];
  112.                 Yd = [Yd(1:2) yy Yd(5:end)];
  113.                 ArrowData = [Xd ; Yd];
  114.               
  115.         end
  116.         %-------------------------------------------
  117.         if ~(isequal(sca,ones(2,1)) | isequal(sca,ones(1,2)))
  118.             MSca = [sca(1) 0 ; 0 sca(2)];
  119.             ArrowData = MSca*ArrowData;
  120.         end
  121.         if ~isequal(rot,0)
  122.             MRot = [cos(rot) sin(rot) ; -sin(rot) cos(rot)];
  123.             ArrowData = MRot*ArrowData;
  124.         end
  125.         if ~(isequal(tra,zeros(2,1)) | isequal(tra,zeros(1,2)))
  126.             VTra = [tra(1) ; tra(2)]; 
  127.             ArrowData = ArrowData + VTra(:,ones(1,size(ArrowData,2)));
  128.         end
  129.         HDL = patch( ...
  130.             'Xdata',ArrowData(1,:),'Ydata',ArrowData(2,:),...
  131.             'FaceColor',col,'Visible',vis);
  132.     case {'special_1'}       
  133.         % defaults.
  134.         %----------
  135.         axe = gca;
  136.         vis = 'On';
  137.         col = [1 0 0]; 
  138.         %-------------
  139.         alf = pi/4;
  140.         W   = NaN;
  141.         H   = 1/4;
  142.         E   = 1/8;
  143.         %-----------
  144.         Xd = [1 2 3];
  145.         Yd = [1 2 3];
  146.         %------------          
  147.         for k = 1:2:nbarg
  148.             argType = varargin{k};
  149.             argVal  = varargin{k+1};
  150.             Larg = min([3,length(argType)]);
  151.             argType = lower(argType(1:Larg));
  152.             switch argType
  153.                 case 'axe' , axe = argVal;
  154.                 case 'vis' , vis = argVal;
  155.                 case 'col' , col = argVal; 
  156.                 %------------------------
  157.                 case 'xva' , Xd  = argVal;
  158.                 case 'yva' , Yd  = argVal;    
  159.                 case 'alf' , alf = argVal;
  160.                 case 'har' , H   = argVal;
  161.                 case 'war' , W   = argVal;                    
  162.                 case 'wid' , E   = argVal;
  163.                 %------------------------       
  164.                 case 'sca' , sca = argVal;        
  165.                 case 'rot' , rot = argVal;
  166.                 case 'tra' , tra = argVal;
  167.             end
  168.         end
  169.         if isnan(W)
  170.             Z =  tan(alf)*H;
  171.             W = max(Z-E,0);
  172.         end
  173.         Ex = E;
  174.         Ey = E;
  175.         x1 = Xd(1); x2 = Xd(2); x3 = Xd(3);
  176.         y1 = Yd(1); y2 = Yd(2); y3 = Yd(3);
  177.         XY = zeros(2,20);
  178.         XY(:,1)  = [x1-Ex ; y1];  
  179.         XY(:,2)  = [x1+Ex ; y1]; 
  180.         XY(:,3)  = [x1+Ex ; y2];  
  181.         XY(:,4)  = [x2-Ex ; y2]; 
  182.         XY(:,5)  = [x2-Ex ; y1];  
  183.         XY(:,6)  = [x2+Ex ; y1]; 
  184.         XY(:,7)  = [x2+Ex ; y2+2*Ey];
  185.         XY(:,8)  = [(x1+x2)/2 + Ex ; y2+2*Ey]; 
  186.         XY(:,9)  = [(x1+x2)/2 + Ex ; y3];
  187.         XY(:,10) = [x3-Ex ; y3]; 
  188.         XY(:,11) = [x3-Ex ; y1+H];
  189.         XY(:,12) = [x3-Ex-W ; y1+H];
  190.         XY(:,13) = [x3 ; y1];
  191.         XY(:,14) = [x3+Ex+W ; y1+H];
  192.         XY(:,15) = [x3+Ex ; y1+H];
  193.         XY(:,16) = [x3+Ex ; y3+2*Ey];
  194.         XY(:,17) = [(x1+x2)/2 - Ex ; y3+2*Ey];
  195.         XY(:,18) = [(x1+x2)/2 - Ex ; y2+2*Ey];
  196.         XY(:,19) = [x1-Ex ; y2+2*Ey];
  197.         XY(:,20) = XY(:,1);
  198.         %-------------------------------------------
  199.         if ~(isequal(sca,ones(2,1)) | isequal(sca,ones(1,2)))
  200.             MSca = [sca(1) 0 ; 0 sca(2)];
  201.             XY = MSca*XY;
  202.         end
  203.         if ~isequal(rot,0)
  204.             MRot = [cos(rot) sin(rot) ; -sin(rot) cos(rot)];
  205.             XY = MRot*XY;
  206.         end
  207.         if ~(isequal(tra,zeros(2,1)) | isequal(tra,zeros(1,2)))
  208.             VTra = [tra(1) ; tra(2)]; 
  209.             XY = XY + VTra(:,ones(1,size(XY,2)));
  210.         end
  211.         HDL = patch( ...
  212.             'Xdata',XY(1,:),'Ydata',XY(2,:),...
  213.             'FaceColor',col,'Visible',vis);
  214.         
  215.         
  216.     case 'set'
  217.         HDL = varargin{1};
  218.         ArrowData = [get(HDL,'Xdata')' ; get(HDL,'Ydata')'];
  219.         vis = get(HDL,'Visible');
  220.         col = get(HDL,'FaceColor');
  221.         for k = 2:2:nbarg
  222.             argType = varargin{k};
  223.             argVal  = varargin{k+1};
  224.             argType = lower(argType(1:3));
  225.             switch argType
  226.                 case 'vis' , vis = argVal;
  227.                 case 'col' , col = argVal; 
  228.                 case 'sca' , sca = argVal;        
  229.                 case 'rot' , rot = argVal;
  230.                 case 'tra' , tra = argVal;
  231.             end
  232.         end
  233.         if ~(isequal(sca,ones(2,1)) | isequal(sca,ones(1,2)))
  234.             MSca = [sca(1) 0 ; 0 sca(2)];
  235.             ArrowData = MSca*ArrowData;
  236.         end
  237.         if ~isequal(rot,0)
  238.             MRot = [cos(rot) sin(rot) ; -sin(rot) cos(rot)];
  239.             ArrowData = MRot*ArrowData;
  240.         end
  241.         if ~(isequal(tra,zeros(2,1)) | isequal(tra,zeros(1,2)))
  242.             VTra = [tra(1) ; tra(2)]; 
  243.             ArrowData = ArrowData + VTra(:,ones(1,size(ArrowData,2)));
  244.         end
  245.         set(HDL, ...
  246.             'Xdata',ArrowData(1,:),'Ydata',ArrowData(2,:), ...
  247.             'FaceColor',col,'Visible',vis);
  248. end