From a3b4fdac70b493a7f09ffa14c4e0e1a581c0c213 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 4 Jun 2017 23:46:18 +0000 Subject: mptrees (2jun17) git-svn-id: svn://tug.org/texlive/trunk@44453 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/metapost/mptrees/mptrees.mp | 198 +++++++++++++++++++------- 1 file changed, 143 insertions(+), 55 deletions(-) (limited to 'Master/texmf-dist/metapost') diff --git a/Master/texmf-dist/metapost/mptrees/mptrees.mp b/Master/texmf-dist/metapost/mptrees/mptrees.mp index 73adff12cf6..d9a5e49833c 100644 --- a/Master/texmf-dist/metapost/mptrees/mptrees.mp +++ b/Master/texmf-dist/metapost/mptrees/mptrees.mp @@ -2,7 +2,7 @@ %% mptrees.mp %% %% Probability trees with MetaPost %% %% o.peault@posteo.net %% -%% Version 17.05 (May 2017) %% +%% Version 17.06 (June 2017) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This work may be distributed and/or modified under the conditions of @@ -22,12 +22,19 @@ posprob:=0.6; numeric scaleprob; scaleprob:=0.85; % échelle de l'étiquette sur la branche -numeric dirtree; % direction de l'arbre +numeric scaleev; +scaleev:=1; % échelle de l'évènement + +numeric dirtree,dirlabel; % direction de l'arbre dirtree:=0; +dirlabel:=0; numeric proboffset; % redéfinition temporaire de labeloffset pour affichage probas proboffset:=labeloffset; +numeric endedgeshift; +endedgeshift:=0; + pair Orig_arbre[][]; % sommet de l'arbre i,j Orig_arbre[1][1]:=origin; @@ -37,44 +44,109 @@ 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 +shiftev:=0; % dans ce cas, typedec =0 +extra_beginfig:=extra_beginfig & "shiftev:=0;"; % remise à zéro en début de figure numeric typeprob; % affichage de la proba sur la branche typeprob:=1; +boolean abscoord; % Coordonnée absolues +abscoord=false; + +string branchtype,endlabeltype; +branchtype="segment"; +endlabeltype="none"; + +boolean edgearrow; +edgearrow:=false; + +numeric endlabelspace; +endlabelspace:=1cm; + + +% Étiquette au début de l'arbre +vardef startlabel(expr s)= + if dirtree<>0: dirlabel:=dirtree fi; + if dirlabel>0: + theevlabel(labelarbres(s) scaled scaleev,origin,-180+dirlabel) + else: + theevlabel(labelarbres(s) scaled scaleev,origin,180+dirlabel) + fi +enddef; + + +% Étiquettes de fin d'arbre +vardef colonne.endlabel[]= + @ +enddef; + +vardef endlabel[][](expr s)= + save i,j,tmpbranchtype,tmpabscoord,tmps; + numeric i,j; + string tmpbranchtype,tmps; + boolean tmpabscoord; + i:=colonne.#@; + j:=@; + if string s: tmps:= "\strut " & s else: tmps:=s fi; + tmpbranchtype:=branchtype; + branchtype:=endlabeltype; + tmpabscoord:=abscoord; + abscoord:=false; + tree[i][j]((endlabelspace,0) rotated (dirlabel-dirtree))(tmps,"") + hide(branchtype:=tmpbranchtype;abscoord:=tmpabscoord;) +enddef; + vardef labelarbres(expr s)= save p; picture p; if picture s: p=s + elseif path s: p=image(draw s) else: p=textext(s) fi; p enddef; + +% longueur du segment qui traverse la figure p selon l'angle inc +vardef longdir(expr p,inc)= + if urcorner p = llcorner p: + 0 + elseif (abs inc <= abs angle (urcorner p -llcorner p)) or (abs inc > 180 - abs angle (urcorner p -llcorner p)): + abs((lrcorner p - llcorner p)/cosd(inc)) + else: + abs((ulcorner p - llcorner p)/sind(inc)) + fi +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 + else: p = textext(s) 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)) + d=0.5*longdir(p,inc); +% p shifted (z - 0.5(lrcorner p - llcorner p) - 0.5(ulcorner p - llcorner p) + (d+labeloffset)*dir(inc)) + p shifted (z - center p + (d+labeloffset)*dir(inc)) enddef; def evlabel = draw theevlabel enddef; + vardef thelabelbranchehaut(expr Ori,Fin,Fig)= interim labeloffset:=proboffset; + save M,pp; + pair M; path pp; + pp=dessinbranche(Ori,Fin); + M= point (arctime posprob*(arclength pp) of pp) of pp; + M:=M + 0.5(llcorner Fig - lrcorner Fig); if xpart Ori <= xpart Fin: - thelabel.rt(Fig rotated -(dirtree+90),origin) rotated (dirtree+90) shifted posprob[Ori,Fin] + M:=M+proboffset*unitvector(dir (dirlabel+90)) else: - thelabel.rt(Fig rotated -(dirtree-90),origin) rotated (dirtree-90) shifted posprob[Ori,Fin] - fi + M:=M-proboffset*unitvector(dir (dirlabel+90)) + fi; + Fig shifted M enddef; @@ -89,8 +161,6 @@ enddef; - - vardef thelabelbranchesuper(expr Ori,Fin,Fig)= save figtmp; picture figtmp; @@ -122,19 +192,40 @@ vardef thelabelbranche(expr Ori,Fin,Fig)= fi enddef; +%%%%%%%% Dessin de la branche +vardef dessinbranche(expr Ori,Fin)= + if branchtype="segment": + Ori--Fin + else: + Ori--Fin + fi +enddef; -%%%%%%%% Dessin complet de la branche +%%%%%%%% Dessin complet de la branche (avec proba, évènement vardef branche_abs(expr Ori,Fin,Eve,Pro)= - save figtmp,thelab,figlab; + save figtmp,thelab,figlab,tmpshft; picture figtmp,thelab,figlab; + numeric tmpshft; thelab:=labelarbres(Pro) scaled scaleprob; - figlab:=thelabelbranche(Ori,Fin rotatedaround(Ori,dirtree),thelab); + if ypart Ori > ypart Fin: %le décalage se fait en fonction de la direction de la branche + tmpshft:=endedgeshift + else: + tmpshft:=-endedgeshift + fi; + figlab:=thelabelbranche(Ori,(Fin+ (0,tmpshft)) rotatedaround(Ori,dirtree),thelab); figtmp=image(% - draw Ori--Fin rotatedaround(Ori,dirtree); + if branchtype<>"none": + if edgearrow: + drawarrow + else: + draw + fi + dessinbranche(Ori,Fin + (0,tmpshft)) rotatedaround(Ori,dirtree) + fi; draw figlab; - evlabel(Eve,Fin rotatedaround(Ori,dirtree),dirtree) + evlabel(Eve,Fin rotatedaround(Ori,dirtree),dirlabel) ); figtmp enddef; @@ -150,6 +241,7 @@ vardef _arbre_(expr Ori)(text t)(text r)= % (pt)(pt1,pt2...)(ev,proba,ev,proba.. picture figtmp,labeltmp[]; numeric counttmp,countlab; pair Fintmp[]; + if dirtree<>0: dirlabel:=dirtree fi; if colonne_cour=1: for i=1 upto 6: countligne[i]:=0; endfor fi figtmp=image(% counttmp:=0; @@ -163,11 +255,12 @@ vardef _arbre_(expr Ori)(text t)(text r)= % (pt)(pt1,pt2...)(ev,proba,ev,proba.. 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]); + draw branche_abs(Ori,Fintmp[counttmp],labeltmp[1] scaled scaleev,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)) + if typedec=0: ((longdir(labeltmp[1] scaled scaleev,dirlabel)+2labeloffset)*(1,0)) else: (shiftev,0) fi + if dirtree=0: rotatedaround(Fintmp[counttmp],dirlabel) fi rotatedaround(Ori,dirtree); countlab:=0 fi; @@ -201,11 +294,19 @@ vardef arbre_decv(expr Ori,horiz,Ymax)(text t)(text r)= save Fin,compt,Ytmp; numeric compt,Ytmp; pair Fin[]; - Fin[0]:=Ori+(horiz,Ymax); + if abscoord: + Fin[0]:=(horiz,Ymax) + else: + Fin[0]:=Ori+(horiz,Ymax) + fi; compt:=0;Ytmp:=Ymax; for i=t: compt:=compt+1;Ytmp:=i; - Fin[compt]:=Ori+(horiz,Ytmp); + if abscoord: + Fin[compt]:=(horiz,Ytmp) + else: + Fin[compt]:=Ori+(horiz,Ytmp) + fi; endfor def ptarr= Fin[0] @@ -221,13 +322,21 @@ 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); + if abscoord: + Fin[0]:=(horiz,Ymax + ypart Ori) + else: + Fin[0]:=Ori+(horiz,Ymax) + fi; 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); + if abscoord: + Fin[compt/2]:=(0, ypart Ori) + (horiz,Ymax-decy*compt/2) + else: + Fin[compt/2]:=Ori+(horiz,Ymax-decy*compt/2) + fi; fi endfor def ptarr= @@ -255,11 +364,11 @@ 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; + if shiftev<>0: typedec:=1 fi; compt:=0; for i=t: if numeric i: @@ -283,6 +392,7 @@ vardef comp.arbre[][](text t)(text r)= colonne_cour:=colonne.#@; ligne_cour:=@; typedec:=0; + if shiftev<>0: typedec:=1 fi; save tmp_compt; numeric tmp_compt; tmp_compt:=0; @@ -292,7 +402,10 @@ vardef comp.arbre[][](text t)(text r)= scantokens i fi; endfor - def tmp_text= + if abscoord: + def tmp_text=t enddef + else: + def tmp_text= % Si abscoord tmp_text=t for i=t: hide(tmp_compt:=tmp_compt+1;) if (tmp_compt>1) and (not string i): @@ -301,37 +414,11 @@ vardef comp.arbre[][](text t)(text r)= Orig_arbre[colonne_cour][ligne_cour]+i fi endfor - enddef; + enddef + fi; _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)= @@ -340,6 +427,7 @@ vardef dec.arbre[][](text t)(text r)= colonne_cour:=colonne.#@; ligne_cour:=@; typedec:=0; + if shiftev<>0: typedec:=1 fi; save tmp_compt; numeric tmp_compt; tmp_compt:=0; -- cgit v1.2.3