From 16105119b36b0cbd4ab457abfaf1b37cba8df4d6 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Thu, 11 May 2017 22:45:29 +0000 Subject: repere (11may17) git-svn-id: svn://tug.org/texlive/trunk@44298 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/metapost/repere/repere.mp | 311 +++++++++++++++++++++++----- 1 file changed, 264 insertions(+), 47 deletions(-) (limited to 'Master/texmf-dist/metapost/repere') diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp index 3027bdac026..a9094e3e10c 100644 --- a/Master/texmf-dist/metapost/repere/repere.mp +++ b/Master/texmf-dist/metapost/repere/repere.mp @@ -1,8 +1,8 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% repere.mp %% %% Macros pour la construction de figures dans un repère %% -%% o.peault@openmailbox.org %% -%% Version 16.10 (Octobre 2016) %% +%% o.peault@posteo.net %% +%% Version 17.05 (Mai 2017) %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % This work may be distributed and/or modified under the conditions of @@ -102,6 +102,7 @@ vardef definitionrepere@#(text t) = save i,_def; if not rep_groupe: oldbeginfig(_nfig);bf:=true fi; numeric _def[],i,unitex,unitey,unite; + numeric Xmin,Xmax,Ymin,Ymax,XmiN,XmaX,YmiN,YmaX; _def[7]:=90;i:=1; for _i=t: _def[i]:=_i; i:=i+1; endfor; Xmin:=_def1; Xmax:=_def2; Ymin:=_def4; Ymax:=_def5; theta:=_def7; @@ -150,7 +151,8 @@ def init_traces = vardef thelabel@#(expr s,z) = % Position s near z save p; picture p; if picture s: p=s - else: p = s infont defaultfont scaled defaultscale +% else: p = s infont defaultfont scaled defaultscale + else: p = LaTeX(s) fi; p shifted (_cart(z) + labeloffset*laboff@# - (labxf@#*lrcorner p + labyf@#*ulcorner p @@ -205,6 +207,12 @@ def _finarr text t = filldraw arrowhead _apth t enddef; +def _findarr text t = + olddraw _apth t; + filldraw arrowhead _apth withpen currentpen t; + filldraw arrowhead reverse _apth withpen currentpen t +enddef; + vardef arrowhead expr p = %redéfinition flèches save q,e; path q; pair e; e = point length p of p; @@ -247,6 +255,8 @@ enddef; def _defcadre= cadre:=(Xmin,Ymin)--(Xmin,Ymax)--(Xmax,Ymax)--(Xmax,Ymin)--cycle; + XmiN:=Xmin-0.05(Xmax-Xmin);XmaX:=Xmax+0.05(Xmax-Xmin); + YmiN:=Ymin-0.05(Ymax-Ymin);YmaX:=Ymax+0.05(Ymax-Ymin); _diag:=abs(llcorner cadre - urcorner cadre); _diag_:=abs(llcorner _cart(cadre) - urcorner _cart(cadre)); _largcadre:=abs(llcorner cadre - lrcorner cadre); @@ -881,8 +891,7 @@ vardef axesunit= draw axes(0,0); draw axexpart(1); draw axeypart(1); - label.llft(LaTeX("$0$"),_cart(0,0)); - % label.llft("0",_cart(0,0)); + label.llft("$0$",_cart(0,0)); ); $ enddef; @@ -965,7 +974,7 @@ vardef nommepoint@#(text t)= if long_texte(t)=1: dess:=image(draw MarquePointFig(t); ch:=_chaine(t); - label@#(LaTeX("$" & ch & "$"),t) withcolor coullabel) + label@#("$" & ch & "$",t) withcolor coullabel) else: dess:=image(% for PP=t: @@ -977,6 +986,7 @@ vardef nommepoint@#(text t)= dess enddef; + vardef nommecourbe@#(suffix p)(text t)= save A,ch,dess; pair A; @@ -985,7 +995,7 @@ vardef nommecourbe@#(suffix p)(text t)= if long_texte(t)=1: dess:=image(ch:=_chaine(p); A:=(t,fonccourbe.p(t)); - label@#(LaTeX("$" & ch & "$"),A) withcolor coullabelfonc) + label@#("$" & ch & "$",A) withcolor coullabelfonc) else: dess:=image(% for _a=t: @@ -999,6 +1009,9 @@ enddef; + + + vardef nommeobj@#(text t)= save $; picture $; @@ -1006,6 +1019,7 @@ vardef nommeobj@#(text t)= else: for i=t: if pair i: $:=nommepoint@#(t) + elseif str @#="": $:=nommeautoobj(t) else: $:=nommecourbe@#(t) fi; exitif true; @@ -1017,17 +1031,113 @@ enddef; def nomme = draw nommeobj enddef; +% +% Notation automatique des chemins 02/17 +% +string prefnomme; +prefnomme:="right"; + +% Permet de savoir si un point est mieux placé relativement à prefnomme +tertiarydef A estmieuxplace B = + if prefnomme="right": xpart A > xpart B + elseif prefnomme="left": xpart A < xpart B + elseif prefnomme="top": ypart A > ypart B + elseif prefnomme="bottom": ypart A < ypart B + elseif hide(errmessage "string 'prefnomme' should be set to left, right, top or bottom") + fi +enddef; + +% Cherche le "time" du meilleur point +vardef pointnommetime(expr p)= + save Pt, nbint, P, T,pp; + pair Pt,P[]; + numeric nbint,pp,T[]; + intercourbestimes(T)(cadre,p); + Pt:=_O;pp:=0; + if known T[1]: + Pt:= point T[1] of p; + pp:=T[1]; + nbint:=1; + forever: + exitif not known T[nbint+1]; + nbint:=nbint+1; + if (point T[nbint] of p) estmieuxplace Pt: + Pt:=point T[nbint] of p; + pp:=T[nbint]; + fi; + endfor + fi; + pp +enddef; + +% Cherche la "meilleure" position du label du point pp de time tt du chemin courbe +vardef position(expr pp,tt,courbe)= + save pos,tmpdir; + string pos; + numeric tmpdir; + tmpdir := angle(direction tt of courbe); + if arrondimil((Ymax-ypart pp)/(Ymax-Ymin))=0: + if tmpdir <0: pos:="llft" + else: pos:="lrt" + fi + elseif arrondimil((Ymin-ypart pp)/(Ymax-Ymin))=0: + if tmpdir <0: pos:="urt" + else: pos:="ulft" + fi + elseif arrondimil((Xmax-xpart pp)/(Xmax-Xmin))=0: + if tmpdir <0: pos:="llft" + else: pos:="ulft" + fi + elseif arrondimil((Xmin-xpart pp)/(Xmax-Xmin))=0: + if tmpdir <0: pos:="urt" + else: pos:="lrt" + fi + fi; + pos +enddef; + +% Notation automatique des chemins + +% Avec label automatique +vardef nommeautoobjsuf(suffix p)= + nommeautoobjtex(p,"$" & _chaine(p) & "$") +enddef; + +% Avec label donné +vardef nommeautoobjtex(expr p,leg)= + save ptA,pos,ttmp; + pair ptA; + numeric ttmp; + string pos; + ttmp:=pointnommetime(p); + ptA:= point ttmp of p; + pos:=position(ptA,ttmp,p); + if string leg: + scantokens("thelabel." & pos)(leg,ptA) + else: + scantokens("thelabel." & pos)(leg scaled defaultscale,ptA) + fi +enddef; + +vardef nommeautoobj(text t)= + if long_texte(t)=1: nommeautoobjsuf(t) + else: nommeautoobjtex(t) + fi +enddef; + + + vardef vecteur@#(expr A)(text t)= save $,ch,m; picture $; pair m; string ch; $=image(% - if long_texte(t)=1: drawarrow A--A+t;ch:=_chaine(t);label@#(LaTeX("$\vv{" & ijmath(ch) & "}$"),A+t/2) + if long_texte(t)=1: drawarrow A--A+t;ch:=_chaine(t);label@#("$\vv{" & ijmath(ch) & "}$",A+t/2) else: for u=t: if pair u: drawarrow A--A+u; m:=A+u/2 - else: if string u: if u<>"": label@#(LaTeX("$\vv{" & u & "}$"),m) fi else: label@#(u,m) fi + else: if string u: if u<>"": label@#("$\vv{" & u & "}$",m) fi else: label@#(u,m) fi fi; endfor fi); @@ -1103,7 +1213,7 @@ vardef base(suffix a,b,c)= $:=image(% draw vecteur.bot(_O_,(1,0),ijmath(I)) withpen pencircle scaled 0.8 withcolor coulbase; draw vecteur.lft(_O_,(0,1),ijmath(J)) withpen pencircle scaled 0.8 withcolor coulbase; - nomme.llft(_O_,LaTeX("$" & O & "$")) withcolor coulbase + nomme.llft(_O_,"$" & O & "$") withcolor coulbase ); $ enddef; @@ -1115,9 +1225,9 @@ vardef basep(suffix a,b,c)= picture $; O:=_chaine(a); I:=_chaine(b); J:=_chaine(c); $:=image(% - nomme.llft(_O_,LaTeX("$" & O & "$")) withcolor coulbase; - draw axexpart(1,LaTeX("$" & I & "$")) withcolor coulbase; - draw axeypart(1,LaTeX("$" & J & "$")) withcolor coulbase; + nomme.llft(_O_,"$" & O & "$") withcolor coulbase; + draw axexpart(1,"$" & I & "$") withcolor coulbase; + draw axeypart(1,"$" & J & "$") withcolor coulbase; ); $ enddef; @@ -1269,7 +1379,22 @@ vardef intercourbes(suffix P)(expr p,q)= %renvoie les points d'intersections de exitif xpart(pp intersectiontimes q)=-1; P[i]:=point xpart(pp intersectiontimes q) of pp; pp:=subpath(xpart(pp intersectiontimes q)+0.01,length pp) of pp; - %0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin... + %0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin... + i:=i+1; + endfor; +enddef; + +vardef intercourbestimes(suffix T)(expr p,q)= %renvoie le "time" de q des points d'intersections de p et q dans T[] + save i,pp; + numeric i; + path pp; + pp:=p; + i:=1; + forever: + exitif xpart(pp intersectiontimes q)=-1; + T[i]:=ypart(pp intersectiontimes q); + pp:=subpath(xpart(pp intersectiontimes q)+0.01,length pp) of pp; + %0.01(?!) pour que le point trouvé ne soit pas dans le sous-chemin... i:=i+1; endfor; enddef; @@ -1377,9 +1502,11 @@ vardef droiteeqred(expr a,b)= save $; path $; if (-(Ymax-Ymin)/(Xmax-Xmin)a): - $:=(Xmin,a*Xmin+b)--(Xmax,a*Xmax+b); + $:=(XmiN,a*XmiN+b)--(XmaX,a*XmaX+b); + elseif a>0: + $:=(YmiN/a-b/a,YmiN)--(YmaX/a-b/a,YmaX); else: - $:=(Ymin/a-b/a,Ymin)--(Ymax/a-b/a,Ymax); + $:=(YmaX/a-b/a,YmaX)--(YmiN/a-b/a,YmiN); fi; $ enddef; @@ -1548,9 +1675,9 @@ vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init enddef; vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilise les valeurs de suiterec - save $,deb,fin,nom,_qw_,un; - picture $,lab; - string nom; + save $,deb,fin,nom,_qw_,un,lab; + picture $; + string nom,lab; numeric deb,fin,_qw_,un,_prec; deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_; _qw_:=1; @@ -1580,17 +1707,17 @@ vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilis deb:=deb+1;un:=_suiterecfonc_(un) fi; for i=deb upto fin: - lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$"); + lab:="$\num{" & decimal(arrondi(10**_prec,un)) & "}$"; draw projectionx.@#((un,un),lab,-taillegrad); un:=_suiterecfonc_(un); endfor else: if deb=_suiterecdeb_: - label.@#(LaTeX("$" & nom & "_{" & decimal(deb) & "}" & "$"),(un,yO)); + label.@#("$" & nom & "_{" & decimal(deb) & "}" & "$",(un,yO)); deb:=deb+1;un:=_suiterecfonc_(un) fi; for i=deb upto fin: - lab:=LaTeX("$" & nom & "_{" & decimal(i) & "}" & "$"); + lab:="$" & nom & "_{" & decimal(i) & "}" & "$"; draw projectionx.@#((un,un),lab); un:=_suiterecfonc_(un); endfor @@ -1599,9 +1726,9 @@ vardef suiterecprojx@#(text t)= %projections et étiquettes sur axe x, utilis enddef; vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilise les valeurs de suiterec - save $,deb,fin,nom,_qw_,un; - picture $,lab; - string nom; + save $,deb,fin,nom,_qw_,un,lab; + picture $; + string nom,lab; numeric deb,fin,_qw_,un,_prec; deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_; _qw_:=1; @@ -1630,7 +1757,7 @@ vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilis deb:=deb+1; fi; for i=deb-1 upto fin-1: - lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$"); + lab:="$\num{" & decimal(arrondi(10**_prec,un)) & "}$"; draw projectiony.@#((un,_suiterecfonc_(un)),lab,-taillegrad); un:=_suiterecfonc_(un); endfor @@ -1639,7 +1766,7 @@ vardef suiterecprojy@#(text t)= %projections et étiquettes sur axe y, utilis deb:=deb+1; fi; for i=deb-1 upto fin-1: - lab:=LaTeX("$" & nom & "_{" & decimal(i+1) & "}" & "$"); + lab:="$" & nom & "_{" & decimal(i+1) & "}" & "$"; draw projectiony.@#((un,_suiterecfonc_(un)),lab); un:=_suiterecfonc_(un); endfor @@ -1726,26 +1853,27 @@ enddef; vardef projboitemoustache@#(text t)= save $,n,_lab_,_comp_,A,tmp; pair A; - picture $,_lab_[]; + picture $; + string _lab_[]; numeric n_comp_,tmp; n:=long_texte(t); if n=0: - _lab_[1]:=LaTeX("$X_{min}$"); - _lab_[2]:=LaTeX("$Q_1$"); - _lab_[3]:=LaTeX("$M_e$"); - _lab_[4]:=LaTeX("$Q_3$"); - _lab_[5]:=LaTeX("$X_{max}$"); + _lab_[1]:="$X_{min}$"; + _lab_[2]:="$Q_1$"; + _lab_[3]:="$M_e$"; + _lab_[4]:="$Q_3$"; + _lab_[5]:="$X_{max}$"; elseif n=1: if t=0: for i=1 upto 5: _lab_[i]:=nullpicture; endfor else: tmp:=floor(t); for i=1 upto 5: - _lab_[i]:=LaTeX("\num{" & decimal(arrondi(10**tmp,_valeursboitemoustache_[i])) & "}"); + _lab_[i]:="\num{" & decimal(arrondi(10**tmp,_valeursboitemoustache_[i])) & "}"; endfor fi else: _comp_:=1; for i=t: - if numeric i: _lab_[_comp_]:=LaTeX("\num{" & decimal(i) & "}") - elseif string i: _lab_[_comp_]:=LaTeX(i) + if numeric i: _lab_[_comp_]:="\num{" & decimal(i) & "}" + elseif string i: _lab_[_comp_]:=i else: _lab_[_comp_]:=i fi; _comp_:=_comp_+1; @@ -1796,23 +1924,91 @@ def barrei(expr p)= enddef; vardef diagrammebarres(text t)= - save $; - path $; - $:= for i=t: barrei(i)-- endfor cycle; - $ + save tmp; + path tmp; + tmp:= for i=t: barrei(i)-- endfor cycle; + tmp enddef; - +%octobre 2016 +%diagramme en batons de la loi binomiale vardef diagrammebinomiale(expr n,p)= - save $,Abin; - picture $; - pair Abin[]; - $:=scantokens("diagrammebatons("& + save tmp; + picture tmp; + tmp:=scantokens("diagrammebatons("& "(0," & decimal(binomiale(n,p,0)) & ")" & - for i=0 upto n: ",(" & decimal(i) & "," & decimal(binomiale(n,p,i)) & ")" & + for i=1 upto n: ",(" & decimal(i) & "," & decimal(binomiale(n,p,i)) & ")" & endfor ")"); - $ + tmp +enddef; + +%mai 2017 +%diagramme en batons de la loi uniforme discrète +vardef diagrammeuniforme(expr n,m)= + save tmp; + picture tmp; + tmp:=scantokens("diagrammebatons("& + "(" & decimal(n) & "," & decimal(1/(m-n+1)) & ")" & + for i=n+1 upto m: ",(" & decimal(i) & "," & decimal(1/(m-n+1)) & ")" & + endfor + ")"); + tmp +enddef; + +%mai 2017 +%diagramme en batons de la loi géométrique +vardef diagrammegeometrique(expr p)= + save tmp; + picture tmp; + tmp:=scantokens("diagrammebatons("& + "(1," & decimal(p) & ")" & + for i=2 upto Xmax: ",(" & decimal(i) & "," & decimal(((1-p)**(i-1))*p) & ")" & + endfor + ")"); + tmp +enddef; + +%mai 2017 +%diagramme en batons de la loi de Poisson +vardef diagrammepoisson(expr lambda)= + save tmp; + picture tmp; + tmp:=scantokens("diagrammebatons("& + "(0," & decimal(poisson(lambda,0)) & ")" & + for i=1 upto Xmax: ",(" & decimal(i) & "," & decimal(poisson(lambda,i)) & ")" & + endfor + ")"); + tmp +enddef; + + +% mai 2017 +% courbe de la densité de la loi normale +vardef densitenormale(text t)= + if long_texte(t)=2: %les bornes ne sont pas précisées donc on prend Xmin et Xmax + densitenormalebornes(t,Xmin,Xmax) + else: % les bornes sont précisées + densitenormalebornes(t) + fi +enddef; + +%courbe de la densité de la loi normale entre a et b +vardef densitenormalebornes(expr mu,sigma,a,b)= + vardef tmpdens(expr x)= + (1/(sigma*sqrt(2*pi)))*exp(-0.5*(((x-mu)/sigma)**2)) + enddef; + courbefonc(tmpdens)(a,b) +enddef; + + +% Mai 2017 +% courbe de la densité de la loi exponentielle +vardef densiteexponentielle(expr lambda)= + vardef tmpdens(expr x)= + lambda*exp(-lambda*x) + enddef; + courbefonc(tmpdens)(0,Xmax) enddef; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -2150,6 +2346,18 @@ enddef; % LaTeXsetup; textext(sc) scaled defaultscale %enddef; + +% Mai 2017 +% Légende avec flèche +vardef thelegende@#(expr lab,p) = + image(% + label@#(lab,point 0 of p); + drawarrow p) +enddef; + +def legende = draw thelegende enddef; + + %%%%%%%%%%%%%%%Figure intermédiaire%%%%%%%%%%%%%%%%%%% def figureinter= clip currentpicture to (cadre transformed _T); @@ -2247,6 +2455,15 @@ vardef binomiale(expr n,p,k)= $ enddef; +% Mai 2017 +% P(X=k) pour X suivant la loi de Poisson de paramètre lambda +vardef poisson(expr lambda,k)= + exp(-lambda) + for i=1 upto k: + *(lambda/i) + endfor +enddef; + %%%%%%%%%%%%%%% COULEURS %%%%%%%%%%%%%%%%%%% cmykcolor Rouge,Vert,Bleu,Marron,Lime,Orange,Rose,Pourpre,Violet,Cyan,Magenta,Jaune,Olive,Noir,Grisfonce,Gris,Grisclair,Blanc,Beige,Marine,Moutarde,Vertfonce; -- cgit v1.2.3