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

波变换

开发平台:

Matlab

  1. function [xnpos,ynpos] = xynodpos(table_node,order,depth)
  2. %XYNODPOS Computes graphical position of a node in a tree.
  3. %   [XNPOS,YNPOS] = XYNODPOS(TABLE_NODE,ORDER,DEPTH)
  4. %   M. Misiti, Y. Misiti, G. Oppenheim, J.M. Poggi 12-Mar-96.
  5. %   Last Revision: 25-May-2003.
  6. %   Copyright 1995-2004 The MathWorks, Inc.
  7. % $Revision: 1.11.4.2 $
  8. % SPECIAL CASES
  9. %--------------
  10. if (order<=1) || (depth==0)
  11.    xnpos = zeros(1,depth+1);
  12.    if depth > 0
  13.        pasy = 0.8/depth;
  14.        y = 0.1+pasy*[0:depth-1]';
  15.        ynpos = [y y+pasy];
  16.    else
  17.        ynpos = [0.1];
  18.    end
  19.    return
  20. end
  21. % Create nodes indices table.
  22. %----------------------------
  23. ord_ind = 1:order;
  24. order1  = order+1;
  25. N       = size(table_node,2);
  26. xnpos   = zeros(order1,N);
  27. node_exist = (table_node ~= -1);
  28. % Setting the width of the subtrees.
  29. % The initial width is 1.
  30. %-----------------------------------------
  31. xnpos(1,node_exist) = 1;
  32. % Left Nodes Indices.
  33. %--------------------
  34. i_Ltree = (order.^[0:depth]-1)/(order-1)+1;
  35. for d=depth-1:-1:0
  36.     n_d = i_Ltree(d+1);
  37.     i_fath = n_d+[0:order^d-1];
  38.     i_left_child = (i_fath-1)*order+2;
  39.     for k=1:order^d
  40.         i_f  = i_fath(k);
  41.         i_lc = i_left_child(k);
  42.         if table_node(i_lc) ~= -1
  43.             for i=1:order
  44.                 xnpos(i,i_f) = sum(xnpos(ord_ind,i_lc+i-1));
  45.             end
  46.         else
  47.             up    = 1;
  48.             i_asc = i_f;
  49.             while table_node(i_asc) == -1
  50.                 up = up+1;
  51.                 i_asc = floor((i_asc-2)/order)+1;
  52.             end             
  53.             xnpos(1,i_lc:i_lc+order-1) = 1/(order^up);
  54.         end
  55.     end
  56. end
  57. % Now the rows 1:order contain the width (depth) of the subtrees.
  58. %
  59. % Elimination of the nodes for the maximum depth.
  60. %------------------------------------------------
  61. if N > 1, xnpos(:,(N-1)/order+1:size(xnpos,2)) = []; end
  62. % Normalization : the total width is 1.
  63. %--------------------------------------
  64. xnpos(ord_ind,:) = xnpos(ord_ind,:)/sum(xnpos(ord_ind,1));
  65. % Setting the minimum values of the abcisses of the subtrees.
  66. %------------------------------------------------------------
  67. xnpos(order1,i_Ltree) = -0.5*ones(size(i_Ltree));
  68. for d=1:depth-1
  69.     n_d = i_Ltree(d+1);
  70.     for p=n_d+1:n_d+order^d-1
  71.         xnpos(order1,p) = sum(xnpos([1:order1],p-1));
  72.     end
  73. end
  74. % Now the row order+1 contains the abscisses of the left extremity
  75. % of the subtrees.
  76. % Change the width of the subtrees.
  77. %----------------------------------
  78. xnpos(ord_ind,:) = cumsum(xnpos(ord_ind,:)) - xnpos(ord_ind,:)/2;
  79. xnpos(ord_ind,:) = xnpos(ord_ind,:)+xnpos((order1)*ones(1,order),:);
  80. % Suppress the last row.
  81. %-----------------------
  82. xnpos = xnpos(1:order,:);
  83. xnpos = [0 xnpos(:)'];
  84. % Y position.
  85. %------------
  86. pasy  = 0.8/depth;
  87. y     = 0.1+pasy*[0:depth-1]';
  88. ynpos = [y y+pasy];