%% 7/2/5 %% %% syntaxe : array dir t1 t2 i ssarbre dimleveltree --> array dim_level
%% 7/2/5 %% %% dir : un vecteur de norme 1
%% 7/2/5 %% %% t1 : la dimension de tout ce qui a deja ete calcule sur ce niveau
%% 7/2/5 %% %% t2 : la dimension du noeud en cours de test
%% 7/2/5 %% %% array : tableau des dimensions des noeuds du niveau
%% 7/2/5 %% %% i : indice du noeud en cours de calcul
%% 7/2/5 %% /dimleveltree {
%% 7/2/5 %% 10 dict begin
%% 7/2/5 %% /ssarbre exch def
%% 7/2/5 %% /i exch def
%% 7/2/5 %% /dim_encours exch def
%% 7/2/5 %% /dim_total exch def
%% 7/2/5 %% /direction defpoint
%% 7/2/5 %% /arraydim exch def
%% 7/2/5 %% ssarbre compte_elts_sousarbre 0 eq {
%% 7/2/5 %% %% c'est fini
%% 7/2/5 %% arraydim length i 1 sub ge {arraydim i dim_encours put} if
%% 7/2/5 %% arraydim dim_total dim_encours add
%% 7/2/5 %% arraydim length 1 sub treenodesepjps mul add
%% 7/2/5 %% } {
%% 7/2/5 %% ssarbre firsttnode /element exch def
%% 7/2/5 %% element istreenode {
%% 7/2/5 %% %% le nouveau est un tnode, donc l'ancien noeud est fini
%% 7/2/5 %% %% a moins qu'on ne vienne juste de commencer (i=-1), on stocke
%% 7/2/5 %% i 0 ge {arraydim i dim_encours put} if
%% 7/2/5 %% /dim_total dim_total dim_encours add store
%% 7/2/5 %% direction element dimsimpletnode /dim_encours exch def
%% 7/2/5 %% arraydim direction dim_total dim_encours i 1 add ssarbre 0 deltnode
%% 7/2/5 %% dimleveltree
%% 7/2/5 %% } {
%% 7/2/5 %% %% "element" est un ssarbre
%% 7/2/5 %% element withdir {
%% 7/2/5 %% element get_tree_dir /newdir defpoint
%% 7/2/5 %% } {
%% 7/2/5 %% direction /newdir defpoint
%% 7/2/5 %% } ifelse
%% 7/2/5 %% newdir direction eqp {
%% 7/2/5 %% %% le ssarbre a la meme direction
%% 7/2/5 %% element compte_noeuds_sousarbre /n exch def
%% 7/2/5 %% [n {0} repeat] direction 0 0 -1 element dimleveltree
%% 7/2/5 %% exch pop
%% 7/2/5 %% dim_encours max
%% 7/2/5 %% /dim_encours exch store
%% 7/2/5 %% arraydim direction dim_total dim_encours i ssarbre cdr dimleveltree
%% 7/2/5 %% } {
%% 7/2/5 %% %% le ssarbre a une autre direction => on l'ignore
%% 7/2/5 %% arraydim direction dim_total dim_encours i ssarbre cdr dimleveltree
%% 7/2/5 %% } ifelse
%% 7/2/5 %% } ifelse
%% 7/2/5 %% } ifelse
%% 7/2/5 %% end
%% 7/2/5 %% } def
%% syntaxe : ssarbre i deltnode --> ssarbre ampute de l'elt d'indice i
%%(on ne compte ni la direction ni le parametre executable eventuel)
/deltreeelt {
3 dict begin
/i exch def
/table exch def
/j 0 def
/eltno 0 def
[
table length {
table j get
dup isarray {
eltno i eq {pop} if
/eltno eltno 1 add store
} if
/j j 1 add store
} repeat
]
end
} def
%% syntaxe : array dir t1 t2 i ssarbre dimleveltree --> array dim_level
%% dir : un vecteur de norme 1
%% t1 : la dimension de tout ce qui a deja ete calcule sur ce niveau
%% t2 : la dimension du noeud en cours de test
%% array : tableau des dimensions des noeuds du niveau
%% i : indice du noeud en cours de calcul
/dimleveltree {
10 dict begin
/ssarbre exch def
/i exch def
/dim_encours exch def
/dim_total exch def
/direction defpoint
/arraydim exch def
ssarbre compte_elts_sousarbre 0 eq {
%% c'est fini
arraydim length i 1 sub ge
i 0 ge and
{arraydim i dim_encours put} if
arraydim dim_total dim_encours add
arraydim length 1 sub treenodesepjps mul add
} {
ssarbre firsttnode /element exch def
element istreenode {
%% le nouveau est un tnode, donc l'ancien noeud est fini
%% a moins qu'on ne vienne juste de commencer (i=-1), on stocke
i 0 ge {arraydim i dim_encours put} if
/dim_total dim_total dim_encours add store
direction element dimsimpletnode /dim_encours exch def
arraydim direction dim_total dim_encours i 1 add ssarbre 0 deltnode
dimleveltree
} {
%% "element" est un ssarbre
element withdir {
element get_tree_dir /newdir defpoint
} {
direction /newdir defpoint
} ifelse
newdir direction eqp {
%% le ssarbre a la meme direction
element compte_noeuds_sousarbre /n exch def
[n {0} repeat] direction 0 0 -1 element dimleveltree
exch pop
dim_encours max
/dim_encours exch store
arraydim direction dim_total dim_encours i ssarbre 0 deltreeelt dimleveltree
} {
%% le ssarbre a une autre direction => on l'ignore
arraydim direction dim_total dim_encours i ssarbre 0 deltreeelt dimleveltree
} ifelse
} ifelse
} ifelse
end
} def
|