diff options
Diffstat (limited to 'Master/texmf-dist/metapost')
-rw-r--r-- | Master/texmf-dist/metapost/mptrees/mptrees.mp | 381 |
1 files changed, 381 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/mptrees/mptrees.mp b/Master/texmf-dist/metapost/mptrees/mptrees.mp new file mode 100644 index 00000000000..73adff12cf6 --- /dev/null +++ b/Master/texmf-dist/metapost/mptrees/mptrees.mp @@ -0,0 +1,381 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% mptrees.mp %% +%% Probability trees with MetaPost %% +%% o.peault@posteo.net %% +%% Version 17.05 (May 2017) %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This work may be distributed and/or modified under the conditions of +% the LaTeX Project Public License, either version 1.3 of this license +% or (at your option) any later version. The latest version of this +% license is in http://www.latex-project.org/lppl.txt +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +if not known mplib: input latexmp fi; + +boolean arbres_latexmp; +arbres_latexmp:=true; + +numeric posprob; % position de l'étiquette sur la branche +posprob:=0.6; + +numeric scaleprob; +scaleprob:=0.85; % échelle de l'étiquette sur la branche + +numeric dirtree; % direction de l'arbre +dirtree:=0; + +numeric proboffset; % redéfinition temporaire de labeloffset pour affichage probas +proboffset:=labeloffset; + +pair Orig_arbre[][]; % sommet de l'arbre i,j +Orig_arbre[1][1]:=origin; + +numeric colonne_cour,ligne_cour; + +numeric countligne[]; % nombre de ligne pour le niveau i + +numeric typedec; % 0 origine dépend de la taille de l'évènement, 1 taille fixée +numeric shiftev; % taille du décalage dans le cas où typedec=1 + + +numeric typeprob; % affichage de la proba sur la branche +typeprob:=1; + + +vardef labelarbres(expr s)= + save p; picture p; + if picture s: p=s + else: p=textext(s) + fi; + p +enddef; + +vardef theevlabel(expr s,z,inc)= + save p; picture p; + save d; numeric d; + if picture s: p=s + else: p = textext(s) scaled defaultscale + fi; + if abs inc < abs angle (urcorner p -llcorner p): + d=abs(0.5(lrcorner p - llcorner p)/cosd(inc)) + else: + d=abs(0.5(ulcorner p - llcorner p)/sind(inc)) + fi; + p shifted (z - 0.5(lrcorner p - llcorner p) - 0.5(ulcorner p - llcorner p) + (d+labeloffset)*dir(inc)) +enddef; + +def evlabel = draw theevlabel enddef; + + +vardef thelabelbranchehaut(expr Ori,Fin,Fig)= + interim labeloffset:=proboffset; + if xpart Ori <= xpart Fin: + thelabel.rt(Fig rotated -(dirtree+90),origin) rotated (dirtree+90) shifted posprob[Ori,Fin] + else: + thelabel.rt(Fig rotated -(dirtree-90),origin) rotated (dirtree-90) shifted posprob[Ori,Fin] + fi +enddef; + + +vardef thelabelbranchehautrot(expr Ori,Fin,Fig)= + interim labeloffset:=proboffset; + if xpart Ori <= xpart Fin: + Fig shifted (0.5*(ulcorner Fig - lrcorner Fig) + llcorner Fig+(0,proboffset)) rotated (angle(Fin-Ori)) shifted posprob[Ori,Fin] + else: + Fig shifted (0.5*(ulcorner Fig - lrcorner Fig) + llcorner Fig+(0,proboffset)) rotated (angle(Ori-Fin)) shifted posprob[Ori,Fin] + fi +enddef; + + + + + +vardef thelabelbranchesuper(expr Ori,Fin,Fig)= + save figtmp; + picture figtmp; + figtmp:=Fig shifted (posprob[Ori,Fin]-0.5*(lrcorner Fig + ulcorner Fig)); + image(fill bbox figtmp withcolor background; + draw figtmp) +enddef; + + +vardef thelabelbranchesuperrot(expr Ori,Fin,Fig)= + save figtmp; + picture figtmp; + figtmp:=Fig shifted (-0.5*(lrcorner Fig + ulcorner Fig)) rotated (angle(Fin-Ori)) shifted posprob[Ori,Fin]; + image(fill bbox figtmp withcolor background; + draw figtmp) +enddef; + + + +vardef thelabelbranche(expr Ori,Fin,Fig)= + if typeprob=1: + thelabelbranchehaut(Ori,Fin,Fig) + elseif typeprob=2: + thelabelbranchesuper(Ori,Fin,Fig) + elseif typeprob=3: + thelabelbranchehautrot(Ori,Fin,Fig) + elseif typeprob=4: + thelabelbranchesuperrot(Ori,Fin,Fig) + fi +enddef; + + + +%%%%%%%% Dessin complet de la branche + +vardef branche_abs(expr Ori,Fin,Eve,Pro)= + save figtmp,thelab,figlab; + picture figtmp,thelab,figlab; + thelab:=labelarbres(Pro) scaled scaleprob; + figlab:=thelabelbranche(Ori,Fin rotatedaround(Ori,dirtree),thelab); + figtmp=image(% + draw Ori--Fin rotatedaround(Ori,dirtree); + draw figlab; + evlabel(Eve,Fin rotatedaround(Ori,dirtree),dirtree) + ); + figtmp +enddef; + + +vardef branche_rel(expr Ori,dx,dy,Eve,Pro)= + branche_abs(Ori,Ori+(dx,dy),Eve,Pro) +enddef; + + +vardef _arbre_(expr Ori)(text t)(text r)= % (pt)(pt1,pt2...)(ev,proba,ev,proba...) + save figtmp,n,Fintmp,labeltmp,counttmp,countlab; + picture figtmp,labeltmp[]; + numeric counttmp,countlab; + pair Fintmp[]; + if colonne_cour=1: for i=1 upto 6: countligne[i]:=0; endfor fi + figtmp=image(% + counttmp:=0; + for i=t: + counttmp:=counttmp+1; + Fintmp[counttmp]:=i; + endfor; + counttmp:=0;countlab:=0; + for i=r: + countlab:=countlab+1; + labeltmp[countlab]:=labelarbres(i); + if countlab=2: + counttmp:=counttmp+1;countligne[colonne_cour+1]:=countligne[colonne_cour+1]+1; + draw branche_abs(Ori,Fintmp[counttmp],labeltmp[1],labeltmp[2]); + Orig_arbre[colonne_cour+1][countligne[colonne_cour+1]]:=Fintmp[counttmp] shifted + if typedec=0: (lrcorner labeltmp[1]-llcorner labeltmp[1]+2labeloffset*(1,0)) + else: (shiftev,0) + fi + rotatedaround(Ori,dirtree); + countlab:=0 + fi; + endfor); + figtmp +enddef; + + +vardef arbre_var(expr Ori,horiz,Ymax)(text t)(text r)= % (pt,dec horiz,Ymax)(dy1,dy2...)(ev,proba,ev,proba...) + save Fin,compt,Ytmp; + numeric compt,Ytmp; + pair Fin[]; + Fin[0]:=Ori+(horiz,Ymax); + compt:=0;Ytmp:=Ymax; + for i=t: + compt:=compt+1;Ytmp:=Ytmp-i; + Fin[compt]:=Ori+(horiz,Ytmp); + endfor + def ptarr= + Fin[0] + for i=1 upto compt: + ,Fin[i] + endfor + enddef; + _arbre_(Ori)(ptarr)(r) +enddef; + + +vardef arbre_decv(expr Ori,horiz,Ymax)(text t)(text r)= + % (pt,dec horiz)(dy1,dy2...)(ev,proba,ev,proba...) + save Fin,compt,Ytmp; + numeric compt,Ytmp; + pair Fin[]; + Fin[0]:=Ori+(horiz,Ymax); + compt:=0;Ytmp:=Ymax; + for i=t: + compt:=compt+1;Ytmp:=i; + Fin[compt]:=Ori+(horiz,Ytmp); + endfor + def ptarr= + Fin[0] + for i=1 upto compt: + ,Fin[i] + endfor + enddef; + _arbre_(Ori)(ptarr)(r) +enddef; + + +vardef arbre_fixe(expr Ori,horiz,Ymax,decy)(text r)= + save Fin,compt,compt_par; + numeric compt,compt_par; + pair Fin[]; + Fin[0]:=Ori+(horiz,Ymax); + compt:=0;compt_par:=0; + for i=r: + compt:=compt+1;compt_par:=compt_par+1; + if compt_par=2: + compt_par:=0; + Fin[compt/2]:=Ori+(horiz,Ymax-decy*compt/2); + fi + endfor + def ptarr= + Fin[0] + for i=1 upto compt: + ,Fin[i] + endfor + enddef; + _arbre_(Ori)(ptarr)(r) +enddef; + + +vardef colonne.reg.arbre[]= + @ +enddef; + +vardef colonne.comp.arbre[]= + @ +enddef; + +vardef colonne.dec.arbre[]= + @ +enddef; + + +vardef reg.arbre[][](text t)(text r)= + save compt,decal; +% numeric compt,decal[],shiftev; + numeric compt,decal[]; + colonne_cour:=colonne.#@; + ligne_cour:=@; + typedec:=0; + compt:=0; + for i=t: + if numeric i: + compt:=compt+1; + decal[compt]:=i + else: + typedec:=1; + scantokens i + fi; + endfor + compt:=0; + for i=r: + compt:=compt+1; + endfor + arbre_fixe(Orig_arbre[colonne_cour][ligne_cour],decal[1],(compt/2-1)*decal[2]/2,decal[2])(r) +enddef; + + + +vardef comp.arbre[][](text t)(text r)= + colonne_cour:=colonne.#@; + ligne_cour:=@; + typedec:=0; + save tmp_compt; + numeric tmp_compt; + tmp_compt:=0; + for i=t: + if string i: + typedec:=1; + scantokens i + fi; + endfor + def tmp_text= + for i=t: + hide(tmp_compt:=tmp_compt+1;) + if (tmp_compt>1) and (not string i): + ,Orig_arbre[colonne_cour][ligne_cour]+i + elseif not string i: + Orig_arbre[colonne_cour][ligne_cour]+i + fi + endfor + enddef; + _arbre_(Orig_arbre[colonne_cour][ligne_cour])(tmp_text)(r) +enddef; + + +vardef ddec.arbre[][](text t)(text r)= + save decal; + numeric decal[]; + colonne_cour:=colonne.#@; + ligne_cour:=@; + typedec:=0; + save tmp_compt; + numeric tmp_compt; + tmp_compt:=0; + for i=t: + if numeric i: + tmp_compt:=tmp_compt+1; + decal[tmp_compt]:=i + else: + typedec:=1; + scantokens i + fi; + endfor + def tmp_text= + -decal[3] + for i=4 upto tmp_compt: + ,-decal[i] + endfor + enddef; + arbre_var(Orig_arbre[colonne_cour][ligne_cour],decal[1],decal[2])(tmp_text)(r) +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%% Modif 10/16 - Décalage par rapport à l'origine +vardef dec.arbre[][](text t)(text r)= + save decal; + numeric decal[]; + colonne_cour:=colonne.#@; + ligne_cour:=@; + typedec:=0; + save tmp_compt; + numeric tmp_compt; + tmp_compt:=0; + for i=t: + if numeric i: + tmp_compt:=tmp_compt+1; + decal[tmp_compt]:=i + else: + typedec:=1; + scantokens i + fi; + endfor + def tmp_text= + decal[3] + for i=4 upto tmp_compt: + ,decal[i] + endfor + enddef; + arbre_decv(Orig_arbre[colonne_cour][ligne_cour],decal[1],decal[2])(tmp_text)(r) +enddef; +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 + +vardef arbre[][](text t)(text r)= + save tmp_type,tmp_compt; + numeric tmp_type,tmp_compt; + tmp_compt:=0; + for i=t: + if numeric i: tmp_compt:=tmp_compt+1 fi; + endfor + if tmp_compt=0: % Arbre défini par des points (dec_horiz,dec_vert) + comp.#@.@(t)(r) + elseif tmp_compt=2: % Arbre régulier, on donne largeur et esp. vert. + reg.#@.@(t)(r) + else: + dec.#@.@(t)(r) % Arbre semi-régulier, largeur fixe, decalages vert. + fi +enddef; + +def tree = arbre enddef; |