summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/metapost
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2017-06-04 23:46:18 +0000
committerKarl Berry <karl@freefriends.org>2017-06-04 23:46:18 +0000
commita3b4fdac70b493a7f09ffa14c4e0e1a581c0c213 (patch)
tree173846a645fa67bf1dd0b8cfdbf6592ac1f4cb74 /Master/texmf-dist/metapost
parentb0f56d42fd0a34fb4afdac35f6b58625e2b67057 (diff)
mptrees (2jun17)
git-svn-id: svn://tug.org/texlive/trunk@44453 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/metapost')
-rw-r--r--Master/texmf-dist/metapost/mptrees/mptrees.mp198
1 files changed, 143 insertions, 55 deletions
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;