Source PostScript (dimtree.pps)

Retour Texte non formaté
%% 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