diff options
author | Karl Berry <karl@freefriends.org> | 2013-12-20 22:01:27 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-12-20 22:01:27 +0000 |
commit | 3a829135ea9d1afa97670c399f06685f842d6e61 (patch) | |
tree | 17d02cbf2c649ddb8e2534c44dfc12406a7dc7a3 /Master/texmf-dist/metapost/repere | |
parent | 5ea8fa0cef406b98d720cda6f6b87a033439987b (diff) |
repere (20dec13)
git-svn-id: svn://tug.org/texlive/trunk@32455 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/metapost/repere')
-rw-r--r-- | Master/texmf-dist/metapost/repere/repere.mp | 1944 |
1 files changed, 1944 insertions, 0 deletions
diff --git a/Master/texmf-dist/metapost/repere/repere.mp b/Master/texmf-dist/metapost/repere/repere.mp new file mode 100644 index 00000000000..1d8b70c73a5 --- /dev/null +++ b/Master/texmf-dist/metapost/repere/repere.mp @@ -0,0 +1,1944 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% repere.mp %% +%% Macros pour la construction de figures dans un repère %% +%% o.peault@gmail.com %% +%% Version 13.12 (Décembre 2013) %% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% 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 +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +input format; + +warningcheck:=0; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% REPERE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +numeric _nfig,_nbaxes,theta,taillegrad,taillepoint,taillecroix,facteurx,facteury; +boolean flecheaxe,displayfrac,coupe; +_nfig:=1; +path cadre; +numeric _diag,_largcadre,_hautcadre,_tfig; +pair _O,_I,_J; +transform _T; +picture _axorlab; pair poslabO; + +string marque_p,fraction; + +facteury:=1; + +boolean rep_groupe; +rep_groupe:=false; + + +let oldbeginfig=beginfig; +let oldendfig=endfig; + +def beginfig(expr c)= + oldbeginfig(c); + _nfig:=c; + rep_groupe:=true +enddef; + +def endfig= + oldendfig; + _nfig:=_nfig+1; + rep_groupe:=false +enddef; + +vardef repere@#(text t)= + if (str @#="") or (str @#="larg") or (str @#="orth") or (str @#="prop"): +% _nfig:=_nfig+1;definitionrepere@#(t) + definitionrepere@#(t) + else: + reperenum@#(t) + fi +enddef; + + +vardef reperenum[]@#(text t)= + _nfig:=@; + definitionrepere@#(t) +enddef; + +boolean bf; +bf:=false; + +vardef definitionrepere@#(text t) = + save i,_def; + if not rep_groupe: oldbeginfig(_nfig);bf:=true fi; + numeric _def[],i,unitex,unitey,unite; + _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; + if str @#="larg": _def3:=(_def3-_def6*cosd(theta)/sind(theta))/(Xmax-Xmin);_def6:=_def6/((Ymax-Ymin)*sind(theta)) + elseif str @#="orth": _def3:=_def3/(Xmax-Xmin); _def6:=_def3;theta:=90 + elseif str @#="prop": _def3:=_def3/(Xmax-Xmin); _def6:=_def6*_def3;theta:=90 + fi; + Ux:=_def3;Uy:=_def6; + _T:=identity xscaled Ux yscaled Uy slanted cosd(theta) yscaled sind(theta); + _defcadre; + settout(Xmin,Xmax,Ymin,Ymax); + _O:=_c(0,0); xO:=0 ; yO:=0; + _I:=_c(1,0); _J:=_c(0,1); + taillegrad:=0.8mm;taillepoint:=3;taillecroix:=1mm;_nbaxes:=0;_axorlab:=nullpicture;poslabO:=(0,0); + marque_p := "plein";displayfrac:=false;flecheaxe:=true;coupe:=true; + defaultscale:=1; + unitex:=abs(_I);unitey:=abs(_J);unite:=unitex; + facteurx:=1;facteury:=1; + string extranumx,extranumy; + extranumx=extranumy=""; +enddef; + +def setaxes(expr a,b,c,d)= + AxeXmin:=a;AxeXmax:=b;AxeYmin:=c;AxeYmax:=d +enddef; + +def setgrad(expr a,b,c,d)= + GradXmin:=a;GradXmax:=b;GradYmin:=c;GradYmax:=d +enddef; + +def setval(expr a,b,c,d)= + ValXmin:=a;ValXmax:=b;ValYmin:=c;ValYmax:=d +enddef; + +def setquad(expr a,b,c,d)= + QuadXmin:=a;QuadXmax:=b;QuadYmin:=c;QuadYmax:=d +enddef; + +def settout(expr a,b,c,d)= + setaxes(a,b,c,d); + setgrad(a,b,c,d); + setval(a,b,c,d); + setquad(a,b,c,d); +enddef; + +let setall=settout; + +def fin = + if _nbaxes=1: draw _axorlab fi; + if coupe: clip currentpicture to cadre fi; + if bf: oldendfig; bf:=false;_nfig:=_nfig+1 fi; +enddef; + +def _defcadre= + cadre:=_c(Xmin,Ymin)--_c(Xmin,Ymax)--_c(Xmax,Ymax)--_c(Xmax,Ymin)--cycle; + _diag:=abs(llcorner cadre - urcorner cadre); + _largcadre:=abs(llcorner cadre - lrcorner cadre); + _hautcadre:=abs(llcorner cadre - ulcorner cadre); + _tfig:=max(_largcadre,_hautcadre); % compatibilité geometriesyr +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% ORIGINE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +def interaxes(expr a,b) = + _O:=_c(a,b); + xO:=a; + yO:=b; +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% AXES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +pair _posgradx, _posgradx.lft, _posgradx.rt, _posgradx.ulft, _posgradx.top, _posgradx.urt, _posgradx.llft, _posgradx.bot, _posgradx.lrt; +_posgradx=_posgradx.bot=_posgradx.lft=_posgradx.rt=-_posgradx.top=(0,-1); +-_posgradx.llft=_posgradx.urt=(0.5,0.5);_posgradx.lrt=-_posgradx.ulft=(0.5,-0.5); + + +pair _posgrady, _posgrady.lft, _posgrady.rt, _posgrady.ulft, _posgrady.top, _posgrady.urt, _posgrady.llft, _posgrady.bot, _posgrady.lrt; +_posgrady=_posgrady.bot=_posgrady.lft=_posgrady.top=-_posgrady.rt=(-1,0); +-_posgrady.llft=_posgrady.urt=(0.5,0.5);_posgrady.lrt=-_posgrady.ulft=(0.5,-0.5); + +vardef _etiqx_@#(expr ab,dec,st)= %étiquettes axe des abscisses + save pic; + picture pic; + if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumx & "}$") + elseif string st: pic:=LaTeX(st) + else: pic:=st fi; + thelabel.@#(pic,_c(ab,yO) shifted (dec*_posgradx@#)) +enddef; + +vardef _etiqy_@#(expr ro,dec,st)= %étiquettes axe des ordonnées + save pic; + picture pic; + if numeric st: pic:=LaTeX("$\num{" & decimal(st) & extranumy & "}$") + elseif string st: pic:=LaTeX(st) + else: pic:=st fi; + thelabel.@#(pic,_c(xO,ro) shifted (dec*_posgrady@#)) +enddef; + + +vardef graduationx(expr x)= %%%%%%% graduation axe des abscisses + ((0,taillegrad)--(0,-taillegrad)) rotated (theta-90) shifted _c(x,yO) +enddef; + + +vardef graduationy(expr y)= %%%%%%% graduation axe des ordonnées + ((taillegrad,0)--(-taillegrad,0)) shifted _c(xO,y) +enddef; + +vardef etiquettex@#(expr x)= + _etiqx_@#(x,taillegrad,x*facteurx) +enddef; + + +vardef etiquettey@#(expr y)= + _etiqy_@#(y,taillegrad,y*facteury) +enddef; + + +vardef dessinaxex=_c(AxeXmin,yO)--_c(AxeXmax,yO) enddef; + +vardef dessinaxey=_c(xO,AxeYmin)--_c(xO,AxeYmax) enddef; + + +vardef graduationsaxex(expr grad)= %%%% ensemble des graduations abscisses + save $;picture $; + $=image(% + imax:=floor((GradXmax-xO)/grad);imin:=ceiling((GradXmin-xO)/grad); + for i=imin upto imax-1: + draw graduationx(arrondimil(i*grad)+xO) withpen pencircle scaled 0.5bp; + endfor + % dernière graduation + if AxeXmax*Ux-(imax*grad+xO)*Ux>ahlength: draw graduationx(arrondimil(imax*grad)+xO) withpen pencircle scaled 0.5bp fi); + $ +enddef; + +vardef graduationsaxey(expr grad)= %%%% ensemble des graduations ordonnées + save $;picture $; + $=image(% + imax:=floor((GradYmax-yO)/grad);imin:=ceiling((GradYmin-yO)/grad); + for i=imin upto imax-1: + draw graduationy(arrondimil(i*grad)+yO) withpen pencircle scaled 0.5bp; + endfor; + % dernière graduation + if AxeYmax*Uy-(imax*grad+yO)*Uy>ahlength: draw graduationy(arrondimil(imax*grad)+yO) withpen pencircle scaled 0.5bp fi); + $ +enddef; + + +vardef etiquettesaxex@#(expr val)= %%% ensemble des étiquettes abscisses + save $,imin,imax,labmin,labmax; + picture $,labmin,labmax; + numeric imin,imax; + $=image(% + imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val); + % définition première étiquette + if (imin<>0): + labmin:= etiquettex.@#(arrondimil(imin*val)+xO) + else: labmin:=nullpicture + fi; + % définition dernière étiquette + if (imax<>0): + labmax:= etiquettex.@#(arrondimil(imax*val)+xO) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquettex.@#(arrondimil(i*val)+xO) + fi; + endfor; + % tracé dernière étiquette + if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi; + ); + $ +enddef; + +vardef etiquettesaxey@#(expr val)= %%% ensemble des étiquettes ordonnées + save $,imin,imax,labmin,labmax; + picture $,labmin,labmax; + numeric imin,imax; + $=image(% + imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val); + % définition première étiquette + if (imin<>0): + labmin:= etiquettey.@#(arrondimil(imin*val)+yO) + else: labmin:=nullpicture + fi; + % définition dernière étiquette + if (imax<>0): + labmax:= etiquettey.@#(arrondimil(imax*val)+yO) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if ypart (llcorner labmin) >=ypart _c(Xmin,Ymin): draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquettey.@#(arrondimil(i*val)+yO) + fi; + endfor; + % tracé dernière étiquette + if ypart (ulcorner labmax) <=ypart _c(Xmax,Ymax): draw labmax fi + ); + $ +enddef; + +vardef _axex_@#(expr grad,val,nn)= + save $; + picture $; + $=image( + % axe + if flecheaxe: drawarrow else: draw fi dessinaxex; + % graduations + if grad>0: draw graduationsaxex(grad) fi; + % étiquettes + if val>0: + if nn=1: + if str @#<>"": + draw etiquettesaxex@#(val); + _axorlab:=etiquettex@#(xO) + else: + draw etiquettesaxex.bot(val); + _axorlab:=etiquettex.bot(xO) + fi; + poslabO:=poslabO + unitvector(0,ypart _posgradx@#); + if xO<>yO: + draw _axorlab + elseif _nbaxes=2: + draw _etiqx_(xO,0,xO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + draw etiquettesaxex@#(val); + draw etiquettex@#(xO) + else: + draw etiquettesaxex.bot(val); + draw etiquettex.bot(xO) + fi + else: + if str @#<>"": + draw etiquettesaxex@#(val) + else: + draw etiquettesaxex.bot(val) + fi + fi + fi + ); + $ +enddef; + +vardef _axey_@#(expr grad,val,nn)= + save $; + picture $; + $=image( + % axe + if flecheaxe: drawarrow else: draw fi dessinaxey; + % graduations + if grad>0: draw graduationsaxey(grad) fi; + % étiquettes + if val>0: + if nn=1: + if str @#<>"": + draw etiquettesaxey@#(val); + _axorlab:=etiquettey@#(yO) + else: + draw etiquettesaxey.lft(val); + _axorlab:=etiquettey.lft(yO) + fi; + poslabO:=poslabO + unitvector(xpart _posgrady@#,0); + if xO<>yO: + draw _axorlab + elseif _nbaxes=2: + draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + draw etiquettesaxey@#(val); + draw etiquettey@#(yO) + else: + draw etiquettesaxey.lft(val); + draw etiquettey.lft(yO) + fi + else: + if str @#<>"": + draw etiquettesaxey@#(val) + else: + draw etiquettesaxey.lft(val) + fi + fi + fi + ); + $ +enddef; + +vardef axex@# (expr grad,val)= %%%%%%axe des abscisses avec gestion graduation origine + _nbaxes:=_nbaxes+1; + _axex_@#(grad,val,1) +enddef; + +vardef axey@# (expr grad,val)= %%%%%%axe des ordonnées avec gestion graduation origine + _nbaxes:=_nbaxes+1; + _axey_@#(grad,val,1) +enddef; + +vardef axexo@#(expr grad,val)= %%%%%%axe des abscisses avec graduation origine + _axex_@#(grad,val,2) +enddef; + +vardef axeyo@#(expr grad,val)= %%%%%%axe des ordonnées avec graduation origine + _axey_@#(grad,val,2) +enddef; + +vardef axexn@#(expr grad,val)= %%%%%%axe des abscisses sans graduation origine + _axex_@#(grad,val,3) +enddef; + +vardef axeyn@#(expr grad,val)= %%%%%%axe des ordonnées sans graduation origine + _axey_@#(grad,val,3) +enddef; + +vardef axes@# (expr grad,val)= %%%% les deux axes + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axex.top(grad,val) else: draw axex.bot(grad,val) fi; + if posy>0: draw axey.rt(grad,val) else: draw axey.lft(grad,val) fi + ); + $ +enddef; + +vardef axeso@# (expr grad,val)= %%%% les deux axes avec origine + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexo.top(grad,val) else: draw axexo.bot(grad,val) fi; + if posy>0: draw axeyo.rt(grad,val) else: draw axeyo.lft(grad,val) fi + ); + $ +enddef; + +vardef axesn@# (expr grad,val)= %%%% les deux axes sans origine + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexn.top(grad,val) else: draw axexn.bot(grad,val) fi; + if posy>0: draw axeyn.rt(grad,val) else: draw axeyn.lft(grad,val) fi + ); + $ +enddef; + +% axes gradués avec multiples de pi + +vardef fracmulttext(expr n,d,tt)= %%%% construction de la fraction n*tt/d + save nn,dd,s,fr,$,fraction; + string s,fr,fraction; + picture $; + numeric nn,dd; + nn:=abs((n)/pgcd(n,d));dd:=d/pgcd(n,d); + if displayfrac: + fraction:="d" + else: fraction:="" + fi; + if dd=1: + if nn=1: + fr:=tt + else: fr:=decimal nn & tt + fi + else: + if nn=1: + fr:="\" & fraction & "frac{" & tt & "}{" & decimal dd & "}" + else: fr:="\" & fraction & "frac{" & decimal nn & tt & "}{" & decimal dd & "}" + fi + fi; + if n<0: + s:="-" + else: s:=""; + if n=0: + fr:= "0" + fi + fi; + $=LaTeX("$" & s & fr & "$"); + $ +enddef; + +vardef fracmultpi(expr n,d)= + fracmulttext(n,d,"\pi") +enddef; + + +vardef etiquettexpi@#(expr n,d)= + _etiqx_@#(n*pi/d,taillegrad,fracmultpi(n,d)) +enddef; + +vardef etiquetteypi@#(expr n,d)= + _etiqy_@#(n*pi/d,taillegrad,fracmultpi(n,d)) +enddef; + + +vardef etiquettesaxexpi@#(expr n,d)= %%% ensemble des étiquettes multiples de pi abscisses + save $,imin,imax,labmin,labmax,val; + picture $,labmin,labmax; + numeric imin,imax,val; + val:=n*pi/d; + $=image(% + imin:=ceiling((ValXmin-xO)/val);imax:=floor((ValXmax-xO)/val); + % définition première étiquette + if (imin<>0): + labmin:= etiquettexpi.@#(imin*n,d) + else: labmin:=nullpicture + fi; + % définition dernière étiquette + if (imax<>0): + labmax:= etiquettexpi.@#(imax*n,d) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if xpart ((ulcorner labmin) transformed inverse _T)>=Xmin: draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquettexpi.@#(i*n,d) + fi; + endfor; + % tracé dernière étiquette + if xpart ((lrcorner labmax) transformed inverse _T)<=Xmax: draw labmax fi; + ); + $ +enddef; + +vardef etiquettesaxeypi@#(expr n,d)= %%% ensemble des étiquettes multiples de pi ordonnées + save $,imin,imax,labmin,labmax,val; + picture $,labmin,labmax; + numeric imin,imax,val; + val:=n*pi/d; + $=image(% + imin:=ceiling((ValYmin-yO)/val);imax:=floor((ValYmax-yO)/val); + % définition première étiquette + if (imin<>0): + labmin:= etiquetteypi.@#(imin*n,d) + else: labmin:=nullpicture + fi; + % définition dernière étiquette + if (imax<>0): + labmax:= etiquetteypi.@#(imax*n,d) + else: labmax:=nullpicture + fi; + % tracé première étiquette + if ypart (llcorner labmin) >=ypart _c(Xmin,Ymin): draw labmin fi; + % tracé autres étiquettes + for i=imin+1 upto imax-1: + if (i<>0): + draw etiquetteypi.@#(i*n,d) + fi; + endfor; + % tracé dernière étiquette + if ypart (ulcorner labmax) <=ypart _c(Xmax,Ymax): draw labmax fi + ); + $ +enddef; + +vardef _axexpi_@#(expr num,den,nn)= + save $,grad; + numeric grad; + picture $; + grad:=num*pi/den; + $=image( + % axe + if flecheaxe: drawarrow else: draw fi dessinaxex; + % graduations + if grad>0: draw graduationsaxex(grad) fi; + % étiquettes + if nn=1: + if str @#<>"": + draw etiquettesaxexpi@#(num,den); + _axorlab:=etiquettexpi@#(xO/pi,1) + else: + draw etiquettesaxexpi.bot(num,den); + _axorlab:=etiquettexpi.bot(xO/pi,1) + fi; + poslabO:=poslabO + unitvector(0,ypart _posgradx@#); + if xO<>yO: + draw _axorlab + elseif _nbaxes=2: + draw _etiqx_(xO,0,fracmultpi(xO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + draw etiquettesaxexpi@#(num,den); + draw etiquettexpi@#(xO/pi,1) + else: + draw etiquettesaxexpi.bot(num,den); + draw etiquettexpi.bot(xO/pi,1) + fi + else: + if str @#<>"": + draw etiquettesaxexpi@#(num,den) + else: + draw etiquettesaxexpi.bot(num,den) + fi + fi + ); + $ +enddef; + +vardef _axeypi_@#(expr num,den,nn)= + save $,grad; + numeric grad; + picture $; + grad:=num*pi/den; + $=image( + % axe + if flecheaxe: drawarrow else: draw fi dessinaxey; + % graduations + if grad>0: draw graduationsaxey(grad) fi; + % étiquettes + if nn=1: + if str @#<>"": + draw etiquettesaxeypi@#(num,den); + _axorlab:=etiquetteypi@#(yO/pi,1) + else: + draw etiquettesaxeypi.lft(num,den); + _axorlab:=etiquetteypi.lft(yO/pi,1) + fi; + poslabO:=poslabO + unitvector(xpart _posgrady@#,0); + if xO<>yO: + draw _axorlab + elseif _nbaxes=2: + draw _etiqy_(yO,0,fracmultpi(yO/pi,1)) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) +% draw _etiqy_(yO,0,yO) shifted (0.7*abs(llcorner _axorlab - urcorner _axorlab)*poslabO) + fi + elseif nn=2: + if str @#<>"": + draw etiquettesaxeypi@#(num,den); + draw etiquetteypi@#(yO/pi,1) + else: + draw etiquettesaxeypi.lft(num,den); + draw etiquetteypi.lft(yO/pi,1) + fi + else: + if str @#<>"": + draw etiquettesaxeypi@#(num,den) + else: + draw etiquettesaxeypi.lft(num,den) + fi + fi + ); + $ +enddef; + +vardef axexpi@# (expr n,d)= %%%%%%axe des abscisses avec gestion graduation origine mult pi + _nbaxes:=_nbaxes+1; + _axexpi_@#(n,d,1) +enddef; + +vardef axeypi@# (expr n,d)= %%%%%%axe des ordonnées avec gestion graduation origine mult pi + _nbaxes:=_nbaxes+1; + _axeypi_@#(n,d,1) +enddef; + +vardef axexpio@#(expr n,d)= %%%%%%axe des abscisses avec graduation origine mult pi + _axexpi_@#(n,d,2) +enddef; + +vardef axeypio@#(expr n,d)= %%%%%%axe des ordonnées avec graduation origine mult pi + _axeypi_@#(n,d,2) +enddef; + +vardef axexpin@#(expr n,d)= %%%%%%axe des abscisses sans graduation origine mult pi + _axexpi_@#(n,d,3) +enddef; + +vardef axeypin@#(expr grad,val)= %%%%%%axe des ordonnées sans graduation origine mult pi + _axeypi_@#(n,d,3) +enddef; + +vardef axespi@# (expr n,d)= %%%% les deux axes mult pi + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexpi.top(n,d) else: draw axexpi.bot(n,d) fi; + if posy>0: draw axeypi.rt(n,d) else: draw axeypi.lft(n,d) fi + ); + $ +enddef; + +vardef axespio@# (expr n,d)= %%%% les deux axes avec origine mult pi + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexpio.top(n,d) else: draw axexpio.bot(n,d) fi; + if posy>0: draw axeypio.rt(n,d) else: draw axeypio.lft(n,d) fi + ); + $ +enddef; + +vardef axespin@# (expr n,d)= %%%% les deux axes sans origine mult pi + save $,posx,posy; + picture $; + numeric posx,posy; + posx:=ypart (_posgradx@#+_posgrady@#); + posy:=xpart (_posgradx@#+_posgrady@#); + $=image(% + if posx>0: draw axexpin.top(n,d) else: draw axexpin.bot(n,d) fi; + if posy>0: draw axeypin.rt(n,d) else: draw axeypin.lft(n,d) fi + ); + $ +enddef; + + +%%%%%%%% graduations isolées + +vardef axexpart@#(text t)= + save $,tmp,var; + picture $; + numeric tmp; + boolean var; + var:=false; + $=image(% + for _i=t: + if numeric _i: + if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi; +% draw ((0,taillegrad)--(0,-taillegrad)) shifted _c(_i,yO) withpen pencircle scaled 0.8bp; + draw graduationx(_i) withpen pencircle scaled 0.8bp; + tmp:=_i; + var:=true + else: + if str @#="": draw _etiqx_.bot(tmp,taillegrad,_i) else: draw _etiqx_@#(tmp,taillegrad,_i) fi; + var:=false + fi; + endfor; + if var: if str @#="": draw _etiqx_.bot(tmp,taillegrad,tmp) else: draw _etiqx_@#(tmp,taillegrad,tmp) fi fi); + $ +enddef; + +vardef axeypart@#(text t)= + save $,tmp,var; + picture $; + numeric tmp; + boolean var; + var:=false; + $=image(% + for _i=t: + if numeric _i: + if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi; + draw ((taillegrad,0)--(-taillegrad,0)) shifted _c(xO,_i) withpen pencircle scaled 0.8bp; + tmp:=_i; + var:=true + else: + if str @#="": draw _etiqy_.lft(tmp,taillegrad,_i) else: draw _etiqy_@#(tmp,taillegrad,_i) fi; + var:=false + fi; + endfor; + if var: if str @#="": draw _etiqy_.lft(tmp,taillegrad,tmp) else: draw _etiqy_@#(tmp,taillegrad,tmp) fi fi); + $ +enddef; + + +vardef axesunit= + save $; + picture $; + $=image(% + draw axes(0,0); + draw axexpart(1); + draw axeypart(1); + label.llft(LaTeX("$0$"),_c(0,0)); + % label.llft("0",_c(0,0)); + ); + $ +enddef; + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% POINTS - VECTEURS %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef _ccoord(expr xA,yA)= + (xA,yA) transformed _T +enddef; + +vardef _cobjet(expr obj)= + obj transformed _T +enddef; + +vardef _c(text t)= + if long_texte(t)=2: _ccoord(t) + else: _cobjet(t) + fi +enddef; + +vardef pol(expr r,theta)= + _c(r*cos(theta),r*sin(theta)) +enddef; + +vardef pold(expr r,theta)= + _c(r*cosd(theta),r*sind(theta)) +enddef; + +color coulpoint,coullabel,coullabelfonc; +coulpoint:=black;coullabel:=black;coullabelfonc:=black; + + +vardef MarquePointFig(expr pp)= % compatibilité geometriesyr15 + save $; + picture $; + if marque_p = "plein": + $:=image(fill fullcircle scaled taillepoint shifted pp withcolor coulpoint); + elseif marque_p = "creux": + $:=image(% + fill fullcircle scaled taillepoint shifted pp withcolor background; + draw fullcircle scaled taillepoint shifted pp withcolor coulpoint); + elseif marque_p = "croix": + $:=image(% + draw ((-taillecroix,0)--(taillecroix,0)) shifted pp withcolor coulpoint; + draw ((0,-taillecroix)--(0,taillecroix)) shifted pp withcolor coulpoint) + else: $:=nullpicture + fi; + $ +enddef; + +def MarquePoint(expr pp)= % compatibilité geometriesyr15 + draw MarquePointFig(pp) +enddef; + + +vardef pointe(text t) = %geometriesyr15 + for p_ = t: if pair p_: MarquePoint(p_); fi endfor; +enddef; + + +vardef nommepoint@#(text t)= + save $,ch,dess,latch; + pair $; + string ch,latch; + picture dess; + if long_texte(t)=1: + dess:=image(draw MarquePointFig(t); + ch:=_chaine(t); + label@#(LaTeX("$" & ch & "$"),t) withcolor coullabel) + else: + dess:=image(% + for PP=t: + if pair PP: MarquePoint(PP); $:=PP + else: if string PP: label@#(PP,$) else: label@#(PP scaled defaultscale,$) fi withcolor coullabel + fi; + endfor) + fi; + dess +enddef; + +vardef nommecourbe@#(suffix p)(text t)= + save A,ch,dess; + pair A; + string ch; + picture dess; + if long_texte(t)=1: + dess:=image(ch:=_chaine(p); + A:=_c(t,fonccourbe.p(t)); + label@#(LaTeX("$" & ch & "$"),A) withcolor coullabelfonc) + else: + dess:=image(% + for _a=t: + if numeric _a: A:=_c(_a,fonccourbe.p(_a)) + else: if string _a: label@#(_a,A) else: label@#(_a scaled defaultscale,A) fi withcolor coullabelfonc + fi; + endfor) + fi; + dess +enddef; + + + +vardef nommeobj@#(text t)= + save $; + picture $; + for i=t: + if pair i: $:=nommepoint@#(t) + else: $:=nommecourbe@#(t) + fi; + exitif true; + endfor + $ +enddef; + +def nomme = draw nommeobj 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("$\vect{" & 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("$\vect{" & u & "}$"),m) fi else: label@#(u,m) fi + fi; + endfor + fi); + $ +enddef; + +vardef marquepointcourbefig(suffix p)(text t)= + save $; + picture $; + $=image(% + for i=t: + MarquePoint(_c(i,fonccourbe.p(i))); + endfor); + $ +enddef; + +def marquepointcourbe= draw marquepointcourbefig enddef; + +vardef marquepointcheminfig(suffix p)(text t)= + save $; + picture $; + $=image(% + for i=t: + MarquePoint(point i of p); + endfor); + $ +enddef; + +def marquepointchemin= draw marquepointcheminfig enddef; + +vardef marquecheminouvertdroitefig(expr p)= + halfcircle shifted (0,-0.5) + scaled (2*taillepoint) + rotated (90+angle(direction infinity of p)) + shifted (point infinity of p) +enddef; + +def marquecheminouvertdroite= draw marquecheminouvertdroitefig enddef; + +vardef marquecheminouvertgauchefig(expr p)= + halfcircle shifted (0,-0.5) + scaled (2*taillepoint) + rotated (-90+angle(direction 0 of p)) + shifted (point 0 of p) +enddef; + +def marquecheminouvertgauche= draw marquecheminouvertgauchefig enddef; + +vardef marquecheminouvert(expr p)= + marquecheminouvertdroite(p); + marquecheminouvertgauche(p) +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% BASE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef ijmath(suffix s)= + if (substring (0,1) of s)="i": s:="\imath" & substring (1,infinity) of s fi; + if (substring (0,1) of s)="j": s:="\jmath" & substring (1,infinity) of s fi; + s +enddef; + + +color coulbase; +coulbase:=black; + +vardef base(suffix a,b,c)= + save O,I,J,$; + string O,I,J; + picture $; + O:=_chaine(a); I:=_chaine(b); J:=_chaine(c); + $:=image(% + draw vecteur.bot(_O,_c(1,0),ijmath(I)) withpen pencircle scaled 0.8 withcolor coulbase; + draw vecteur.lft(_O,_c(0,1),ijmath(J)) withpen pencircle scaled 0.8 withcolor coulbase; + nomme.llft(_O,LaTeX("$" & O & "$")) withcolor coulbase + ); + $ +enddef; + + +vardef basep(suffix a,b,c)= + save O,I,J,$; + string O,I,J; + 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; + ); + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% QUADRILLAGE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + numeric ep; color coul; + ep:= .2bp; %%%%%%%% épaisseur du trait + coul := .7white; %%%%%%%% couleur du trait + def quadstyle= enddef; + + vardef quadrillage(expr quadx,quady) = + save $; + picture $; + $=image(if quadx>0: + for i=ceiling((QuadXmin-xO)/quadx) upto floor((QuadXmax-xO)/quadx): + draw _c(arrondimil(i*quadx)+xO,QuadYmin)--_c(arrondimil(i*quadx)+xO,QuadYmax) quadstyle withpen pencircle scaled ep withcolor coul; + endfor; + fi; + if quady>0: + for i=ceiling((QuadYmin-yO)/quady) upto floor((QuadYmax-yO)/quady): + draw _c(QuadXmin,arrondimil(i*quady)+yO)--_c(QuadXmax,arrondimil(i*quady)+yO) withpen pencircle scaled ep withcolor coul quadstyle; + endfor; + fi); + $ + enddef; + + vardef papierpointe(expr quadx,quady) = + save $; + picture $; + $=image(if (quadx>0) and (quady>0): + for i=ceiling(QuadXmin/quadx) upto floor(QuadXmax/quadx): + for j=ceiling(QuadYmin/quady) upto floor(QuadYmax/quady): + draw (0,0) shifted _c(i*quadx,j*quady) withpen pencircle scaled 2; + endfor; + endfor; + fi); + $ + enddef; + + numeric pm_epa, pm_epb, pm_epc; + color pm_coula, pm_coulb, pm_coulc; + pm_epa := .2bp; pm_epb := .3bp; pm_epc := .4bp; %%%%%%%%%% épaisseurs des traits + pm_coula := .6*white; pm_coulb := .4*white; pm_coulc := black; %%%%%%%%%% couleurs des traits + +vardef papiermillimetre = + save $; + picture $; + $=image(% + for i= ceiling(QuadXmin*Ux*10/cm) upto floor(QuadXmax*Ux*10/cm): + if i mod 5 <> 0: draw (i*cm/10,QuadYmin*Uy)--(i*cm/10,QuadYmax*Uy) withpen pencircle scaled pm_epa withcolor pm_coula fi; + endfor + for i= ceiling(QuadYmin*Uy*10/cm) upto floor(QuadYmax*Uy*10/cm): + if i mod 5<> 0: draw (QuadXmin*Ux,i*cm/10)--(QuadXmax*Ux,i*cm/10) withpen pencircle scaled pm_epa withcolor pm_coula fi; + endfor + % + for i= ceiling(QuadXmin*Ux/cm)*2+1 step 2 until floor(QuadXmax*Ux/cm)*2-1: + draw (i*cm/2,QuadYmin*Uy)--(i*cm/2,QuadYmax*Uy) withpen pencircle scaled pm_epb withcolor pm_coulb; + endfor + for i= ceiling(QuadYmin*Uy/cm)*2+1 step 2 until floor(QuadYmax*Uy/cm)*2-1: + draw (QuadXmin*Ux,i*cm/2)--(QuadXmax*Ux,i*cm/2) withpen pencircle scaled pm_epb withcolor pm_coulb; + endfor + % + for i= ceiling(QuadXmin*Ux/cm) upto floor(QuadXmax*Ux/cm): + draw (i*cm,QuadYmin*Uy)--(i*cm,QuadYmax*Uy) withpen pencircle scaled pm_epc withcolor pm_coulc; + endfor + for i= ceiling(QuadYmin*Uy/cm) upto floor(QuadYmax*Uy/cm): + draw (QuadXmin*Ux,i*cm)--(QuadXmax*Ux,i*cm) withpen pencircle scaled pm_epc withcolor pm_coulc; + endfor); + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% FONCTIONS - COURBES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +vardef courbefonc(suffix f)(expr xmin, xmax, n) = %Courbe représentative d'une fonction + save $,x; + path $; + $=( _c(xmin,f(xmin)) + for i=1 upto n-1: + .._c(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1))) + endfor ); + $ +enddef; + +%%%%%%%%%% TEST %%%%%%%%%%%%% +vardef courbefonct@#(expr xmin, xmax, n) = %Courbe représentative d'une fonction + save $,x; + path $; + $=( _c(xmin,@#(xmin)) + for i=1 upto n-1: + .._c(xmin+i*(xmax-xmin)/(n-1),@#(xmin+i*(xmax-xmin)/(n-1))) + endfor ); + $ +enddef; +%%%%%%%%%% FINTEST %%%%%%%%%%%%% + +vardef courbepoints(suffix f)(expr xmin, xmax, n) = %Points non reliés + save $,x; + picture $; + $=image(MarquePoint(_c(xmin,f(xmin))); + for i=1 upto n-1: + MarquePoint(_c(xmin+i*(xmax-xmin)/(n-1),f(xmin+i*(xmax-xmin)/(n-1)))); + endfor ); + $ +enddef; + +vardef fonccourbe@#(expr x)= %Ordonnée du point de la courbe @# d'abscisse x (dans le repère utilisateur) + ypart ((pointcourbe@#(x)) transformed inverse _T) +enddef; + +vardef pointcourbe@#(expr x)= %Point de la courbe @# d'abscisse x dans le repère utilisateur +save _P_,t; + numeric t; pair _P_; + (t,whatever)=@# intersectiontimes (_c(x,2*Ymin-Ymax)--_c(x,2*Ymax-Ymin)); + if t=-1: _P_:=_c(x,0) + else: _P_:=point t of @# + fi; + _P_ +enddef; + +vardef der@#(expr x)= %Fonction dérivée + save pp,t,v,w,d; + path pp; + pair v,w; + pp:=@#; + (t,whatever) = pp intersectiontimes (_c(x,2*Ymin-Ymax)--_c(x,2*Ymax-Ymin)); + v:=direction t of pp; + w:=unitvector(v transformed inverse _T); + if xpart w = 0: d:=0 else: d:= (ypart w)/(xpart w) fi; + d +enddef; + +vardef intercourbes(suffix P)(expr p,q)= %renvoie les points d'intersections de p et q dans P[] + save i,pp; + numeric i; + path pp; + pp:=p; + i:=1; + forever: + 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... + i:=i+1; + endfor; +enddef; + +vardef ptantecedents(suffix P)(expr y,p)= + intercourbes(P,_c(Xmin,y)--_c(Xmax,y),p) +enddef; + +vardef antecedents(suffix P)(expr y,p)= + pair PP[]; + ptantecedents(PP,y,p); + for i=1 upto 10: P[i]:=xpart (PP[i] transformed inverse _T); endfor +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% TANGENTES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +numeric longtan; +longtan:=20; + +vardef tangentefleche@# (suffix p)(text tt) = + save t,$,pp,i,N; +pair senstan.gauche,senstan.droite,senstan.double; +senstan.gauche=(1,0);senstan.droite=(0,1);senstan.double=(1,1); + numeric N[],i; + i:=0; + pair _v,M; + picture $; + for n=tt: i:=incr i ; N[i]:=n; endfor; + if i=1: N2:=longtan fi; + (t,whatever) = p intersectiontimes (_c(N1,Ymin)--_c(N1,Ymax)); + M:=point t of p; + _v:=N2*unitvector(direction t of p); + $=image(% + MarquePoint(M); + if (xpart senstan@#) <> 0: drawarrow M--M-_v*(xpart senstan@#) fi; + if (ypart senstan@#) <> 0: drawarrow M--M+_v*(ypart senstan@#) fi; + ); + $ +enddef; + +vardef tangentedroite(expr p,a) = + save $,m,M,t; + path $; + numeric m,t; + pair M; + (t,whatever) = p intersectiontimes (_c(a,Ymin)--_c(a,Ymax)); + M:=point t of p; + $=M-_diag*unitvector(direction t of p)--M+_diag*unitvector(direction t of p); + $ +enddef; + +vardef tangente@#(suffix p)(text tt) = + if str @#="": tangentedroite(p)(tt) + else: tangentefleche@#(p)(tt) + fi +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% CALCUL INTÉGRAL %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +vardef entrecourbes(expr p,q,xmin,xmax)= + buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),q) +enddef; + +vardef souscourbe(expr p,xmin,xmax)= + buildcycle(droiteeqx(xmax),p,droiteeqx(xmin),_c(Xmin,0)--_c(Xmax,0)) +enddef; + + +vardef rectangles@#(suffix p)(expr a,b,n)= %Riemann, renvoie un chemin fermé + save pas,_rect_; + numeric pas; + path _rect_; + pas=(b-a)/n; + _rect_ = + for i=0 upto n-1: + _c(a+i*pas,yO)--_segmrect_@#(p,a+i*pas,pas)-- + endfor + _c(b,yO)--cycle; + _rect_ +enddef; + +numeric _typerect.min,_typerect.max,_typerect.droite,_typerect.gauche; +_typerect.min=1;_typerect.max=2;_typerect.droite=3;_typerect.gauche=4; + +vardef _segmrect_@#(suffix p)(expr a,pas)= + save _sousp; + path _sousp; + _sousp=subpath (xpart(p intersectiontimes droiteeqx(a)),xpart(p intersectiontimes droiteeqx(a+pas))) of p; + if _typerect@#=1: llcorner _sousp -- lrcorner _sousp + elseif _typerect@#=2: ulcorner _sousp -- urcorner _sousp + elseif _typerect@#=3: (pointcourbe.p(a))--(pointcourbe.p(a) shifted _c(pas,0)) + elseif _typerect@#=4: (pointcourbe.p(a+pas) shifted _c(-pas,0))--(pointcourbe.p(a+pas)) + fi +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% DROITES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef droiteeqred(expr a,b)= + save $; + path $; + if (-(Ymax-Ymin)/(Xmax-Xmin)<a) and ((Ymax-Ymin)/(Xmax-Xmin)>a): + $:=_c(Xmin,a*Xmin+b)--_c(Xmax,a*Xmax+b); + else: + $:=_c(Ymin/a-b/a,Ymin)--_c(Ymax/a-b/a,Ymax); + fi; + $ +enddef; + +vardef droiteeqx(expr c)= + _c(c,2*Ymin-Ymax)--_c(c,2*Ymax-Ymin) +enddef; + +vardef droiteeqcart(expr a,b,c)= + save $; + path $; + if b=0: + $=droiteeqx(-c/a) + else: + $:=droiteeqred(-a/b,-c/b) + fi; + $ +enddef; + +vardef droiteeq(text t)= + save $; + path $; + if long_texte(t)=1: $:= droiteeqx(t) fi; + if long_texte(t)=2: $:= droiteeqred(t) fi; + if long_texte(t)=3: $:= droiteeqcart(t) fi; + $ +enddef; + + +vardef droitept(expr A,B)= %geometrie15syr + (_diag/abs(A-B))[B,A]--(_diag/abs(A-B))[A,B] +enddef; + +vardef droite(text t)= + save $; + path $; + for i=t: + if pair i: $:=droitept(t) else: $:=droiteeq(t) fi; + exitif true; + endfor; + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% DEMI-PLANS %%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +vardef demiplaninf(expr d)= + save $,A,B; + path $; + pair A,B; + if (point 0 of d) yscaled -1 < (point infinity of d) yscaled -1: + A:=point 0 of d; B:= point infinity of d + else: B:=point 0 of d; A:= point infinity of d + fi; + $=A-- + if ypart A>=ypart _c(Xmin,Ymax): _c(Xmin,Ymax)-- fi + if ypart A>ypart _c(Xmin,Ymin): _c(Xmin,Ymin)-- fi + if ypart B>ypart _c(Xmax,Ymin): _c(Xmax,Ymin)-- fi + if ypart B>=ypart _c(Xmax,Ymax): _c(Xmax,Ymax)-- fi + B--cycle; + $ +enddef; + +vardef demiplansup(expr d)= + save $,A,B; + path $; + pair A,B; + if (point 0 of d) yscaled -1 < (point infinity of d) yscaled -1: + A:=point 0 of d; B:= point infinity of d + else: B:=point 0 of d; A:= point infinity of d + fi; + $=A-- + if ypart A<=ypart _c(Xmin,Ymin): _c(Xmin,Ymin)-- fi + if ypart A<ypart _c(Xmin,Ymax): _c(Xmin,Ymax)-- fi + if ypart B<ypart _c(Xmax,Ymax): _c(Xmax,Ymax)-- fi + if ypart B<=ypart _c(Xmax,Ymin): _c(Xmax,Ymin)-- fi + B--cycle; + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% PROJECTIONS %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef projetex(expr A)= + _c(xpart (A transformed inverse _T),yO) +enddef; + +vardef projetey(expr A)= + _c(xO,ypart (A transformed inverse _T)) +enddef; + +vardef projectionx@#(text t)= + save $,_a,_fg,dec; + picture $,_fg;_fg:=nullpicture; + numeric dec;dec=0; + pair _a; + $=image(% + for i=t: + if pair i: draw i--projetex(i);_a:=i elseif numeric i: dec:=i else: _fg:=thelabel.@#(i,projetex(_a)) fi; + endfor; + draw _fg shifted (0,dec)); + $ +enddef; + +vardef projectiony@#(text t)= + save $,_a,_fg,dec; + picture $,_fg;_fg:=nullpicture; + numeric dec;dec=0; + pair _a; + $=image(% + for i=t: + if pair i: draw i--projetey(i);_a:=i elseif numeric i: dec:=i else: _fg:=thelabel.@#(i,projetey(_a)) fi; + endfor; + draw _fg shifted (dec,0)); + $ +enddef; + + +vardef projectionaxes(text t)= + save $,_A,n; + picture $,_fg[];_fg1=_fg2=nullpicture; + pair _A; + numeric n,dd;n=1;dd=0; + $=image(% + for i=t: if numeric i: dd:=i fi; endfor + for i=t: + if not numeric i: + if pair i: _A:=i; + elseif n=1: if ypart _A > ypart _O: draw projectionx.bot(_A,i,-dd) else: draw projectionx.top(_A,i,dd) fi;n:=n+1 + else: if xpart _A > xpart _O: draw projectiony.lft(_A,i,-dd) else: draw projectiony.rt(_A,i,dd) fi;n:=n+1 + fi; + fi; + endfor; + if n<=2: draw projectiony(_A) fi; if n=1: draw projectionx(_A) fi); + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%% SUITES %%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef suite(suffix u)(expr deb,fin)= + save $; + picture $; + $=courbepoints(u,deb,fin,fin-deb+1); + $ +enddef; + +vardef _suiterecfonc_(expr x)=0 enddef; +numeric _suiterecdeb_, _suiterecfin_, _suiterecinit_; + +vardef suiterec(suffix f)(expr deb,fin,init)= %escalier un+1=f(un), u_deb=init + vardef _suiterecfonc_(expr x)=f(x) enddef; + _suiterecdeb_:=deb;_suiterecfin_:=fin;_suiterecinit_:=init; %stocke les valeurs pour réutilisation + save $,un; + path $; + numeric un; + un=init; + $=_c(un,yO) + for i=deb upto fin-1: + --_c(un,f(un))--_c(f(un),f(un)) + hide(un:=f(un)) + endfor; + $ +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; + numeric deb,fin,_qw_,un,_prec; + deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_; + _qw_:=1; + for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin + if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi; + elseif _qw_=2: + deb:=i; + for j=_suiterecdeb_ upto i-1: + un:=_suiterecfonc_(un); + endfor + elseif _qw_=3: fin:=i + fi; + _qw_:=_qw_+1; + endfor; + $=image(% + if nom="": + if deb=_suiterecdeb_: + deb:=deb+1;un:=_suiterecfonc_(un) + fi; + for i=deb upto fin: + draw projectionx.@#(_c(un,un)); + un:=_suiterecfonc_(un); + endfor + elseif nom="_val": + if deb=_suiterecdeb_: +% label.@#(format("%10f",arrondi(10**_prec,un)),_c(un,yO)); + draw etiquettex.@#(arrondi(10**_prec,un)); + deb:=deb+1;un:=_suiterecfonc_(un) + fi; + for i=deb upto fin: +% draw projectionx.@#(_c(un,un),format("%10f",arrondi(10**_prec,un))); + lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$"); + draw projectionx.@#(_c(un,un),lab,-taillegrad); + un:=_suiterecfonc_(un); + endfor + else: + if deb=_suiterecdeb_: + label.@#(LaTeX("$" & nom & "_{" & decimal(deb) & "}" & "$"),_c(un,yO)); + deb:=deb+1;un:=_suiterecfonc_(un) + fi; + for i=deb upto fin: + lab:=LaTeX("$" & nom & "_{" & decimal(i) & "}" & "$"); + draw projectionx.@#(_c(un,un),lab); + un:=_suiterecfonc_(un); + endfor + fi); + $ +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; + numeric deb,fin,_qw_,un,_prec; + deb:=_suiterecdeb_;fin:=_suiterecfin_;un:=_suiterecinit_; + _qw_:=1; + for i=t: %récupère les éventuelles nouvelles valeurs pour deb et fin + if _qw_ =1: if string i: nom:=i else: nom:="_val";_prec:=i fi; + elseif _qw_=2: + deb:=i; + for j=_suiterecdeb_ upto i-2: + un:=_suiterecfonc_(un); + endfor + elseif _qw_=3: fin:=i + fi; + _qw_:=_qw_+1; + endfor; + $=image(% + if nom="": + if deb=_suiterecdeb_: + deb:=deb+1; + fi; + for i=deb-1 upto fin-1: + draw projectiony.@#(_c(un,_suiterecfonc_(un))); + un:=_suiterecfonc_(un); + endfor + elseif nom="_val": + if deb=_suiterecdeb_: + deb:=deb+1; + fi; + for i=deb-1 upto fin-1: + lab:=LaTeX("$\num{" & decimal(arrondi(10**_prec,un)) & "}$"); + draw projectiony.@#(_c(un,_suiterecfonc_(un)),lab,-taillegrad); + un:=_suiterecfonc_(un); + endfor + else: + if deb=_suiterecdeb_: + deb:=deb+1; + fi; + for i=deb-1 upto fin-1: + lab:=LaTeX("$" & nom & "_{" & decimal(i+1) & "}" & "$"); + draw projectiony.@#(_c(un,_suiterecfonc_(un)),lab); + un:=_suiterecfonc_(un); + endfor + fi); + $ +enddef; + + +vardef suiterecproj(text t)= + save $; + picture $; + $=image(% + draw suiterecprojx.bot(t); + draw suiterecprojy.lft(t)); + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% INTERVALLES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +vardef bornex[](expr val)= + ((1mm,-2mm)--(0,-2mm)--(0,2mm)--(1mm,2mm)) if @<0: xscaled -1 fi shifted _c(val,xO) +enddef; + +vardef borney[](expr val)= + ((2mm,1mm)--(2mm,0)--(-2mm,0)--(-2mm,1mm)) if @<0: yscaled -1 fi shifted _c(yO,val) +enddef; + +pair sensborne.FF,sensborne.FO,sensborne.OF,sensborne.OO; +sensborne.FF=-sensborne.OO=(1,-1);sensborne.FO=-sensborne.OF=(1,1); + +vardef intervallex@#(expr vmin,vmax)= + save $; + picture $; + $=image(% + draw _c(vmin,xO)--_c(vmax,xO) withpen pencircle scaled 2pt; + draw bornex[xpart sensborne@#](vmin) withpen pencircle scaled 2pt; + draw bornex[ypart sensborne@#](vmax) withpen pencircle scaled 2pt); + $ +enddef; + +vardef intervalley@#(expr vmin,vmax)= + save $; + picture $; + $=image(% + draw _c(yO,vmin)--_c(yO,vmax) withpen pencircle scaled 2pt; + draw borney[xpart sensborne@#](vmin) withpen pencircle scaled 2pt; + draw borney[ypart sensborne@#](vmax) withpen pencircle scaled 2pt); + $ +enddef; + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%% STATISTIQUES %%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +numeric _decboitemoustache_,_largboitemoustache_; + + +vardef boitemoustache(text t)= + _decboitemoustache_:=1.5cm; + _largboitemoustache_:=1cm; + save $,n; + picture $; + numeric n,_valeursboitemoustache_[]; + n:=1; + for i=t: + _valeursboitemoustache_[n]:=i; + n:=n+1; + endfor; + if known _valeursboitemoustache_[6]: _decboitemoustache_:=_valeursboitemoustache_[6] fi; + if known _valeursboitemoustache_[7]: _largboitemoustache_:=_valeursboitemoustache_[7] fi; + $=image(% + fill fullcircle scaled 3 shifted _c(_valeursboitemoustache_[1],yO); + draw _c(_valeursboitemoustache_[1],yO)--_c(_valeursboitemoustache_[2],yO); + draw _c(_valeursboitemoustache_[2],yO) shifted (0,-_largboitemoustache_/2)--_c(_valeursboitemoustache_[2],yO) shifted (0,_largboitemoustache_/2)--_c(_valeursboitemoustache_[4],yO) shifted (0,_largboitemoustache_/2)--_c(_valeursboitemoustache_[4],yO) shifted (0,-_largboitemoustache_/2)--cycle; + draw _c(_valeursboitemoustache_[3],yO) shifted (0,-_largboitemoustache_/2)--_c(_valeursboitemoustache_[3],yO) shifted (0,_largboitemoustache_/2); + draw _c(_valeursboitemoustache_[4],yO)--_c(_valeursboitemoustache_[5],yO); + fill fullcircle scaled 3 shifted _c(_valeursboitemoustache_[5],yO)% + ) shifted (0,_decboitemoustache_); + $ +enddef; + +vardef projboitemoustache@#(text t)= + save $,n,_lab_,_comp_,A,tmp; + pair A; + picture $,_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}$"); + 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])) & "}"); + endfor + fi + else: _comp_:=1; for i=t: + if numeric i: _lab_[_comp_]:=LaTeX("\num{" & decimal(i) & "}") + elseif string i: _lab_[_comp_]:=LaTeX(i) + else: _lab_[_comp_]:=i + fi; + _comp_:=_comp_+1; + endfor + fi; + $=image(% + for i=1 upto 5: + if (i=1) or (i=5): + A:=_c(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_) + else: A:=_c(_valeursboitemoustache_[i],yO) shifted(0,_decboitemoustache_-_largboitemoustache_/2) + fi; + draw projectionx@#(A,_lab_[i]); + endfor); + $ +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% FONCTIONS USUELLES %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +pi:=3.141592654; +e:=2.718281828; + +vardef sin(expr x) = sind(180*x/pi) enddef; + +vardef cos(expr x) = cosd(180*x/pi) enddef; + +vardef tan(expr x) = sin(x)/cos(x) enddef; + +vardef exp(expr x) = mexp(x*256) enddef; + +vardef ln(expr x) = mlog(x)/256 enddef; + +vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef; + +vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef; + +vardef Arctan(expr x)= pi*angle(1,x)/180 enddef; + +vardef Arcsin(expr x)= Arctan(x/sqrt(1-x**2)) enddef; + +vardef Arccos(expr x)= pi/2-Arcsin(x) enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% REMPLISSAGE %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +let _fill_ = fill; + +def fill expr c= +if path c: _fill_ c else: draw c fi +enddef; + +numeric largbriques,hautbriques,decbriques; +largbriques=12;hautbriques=6;decbriques=6; + +vardef briques(text t)= + if long_texte(t)=0: + repbriques(largbriques,hautbriques,decbriques) + else: + repbriques(t) + fi +enddef; + + + +vardef repbriques(expr larg,haut,dec)= + numeric d;d=0; + image(% + for j=0 upto _hautcadre/haut: + draw ((0,0)--(_largcadre,0)) shifted (0,j*haut); + d:=d+dec;if d>larg: d:=d-larg fi; + for i=0 upto _largcadre/larg: + draw ((0,0)--(0,haut)) shifted (i*larg+d,j*haut); + endfor; + endfor) shifted llcorner cadre +enddef; + + +numeric pashach,anglehach; +pashach=5;anglehach=60; + +vardef hachures(text t)= + if long_texte(t)=0: + rephachures(pashach,anglehach) + else: + rephachures(t) + fi +enddef; + +vardef rephachures(expr pas,angle)= + image(% + for i=floor(-_diag/(2*pas)) upto ceiling(_diag/(2*pas)): + draw ((-_diag/2,0)--(_diag/2,0)) shifted (0,i*pas); + endfor) rotated angle shifted center cadre +enddef; + +numeric pervagues,ampvagues,decvagues; +pervagues=20;ampvagues=3;decvagues=10; + +vardef vagues(text t)= + if long_texte(t)=0: + repvagues(pervagues,ampvagues,decvagues) + else: + repvagues(t) + fi +enddef; + + +vardef repvagues(expr per,amp,dec)= %D'après le manuel de l'utilisateur de MetaPost + image(% + for j=0 upto _hautcadre/dec: + for i=0 upto _largcadre/amp: + draw ((0,0){curl 0}..(per/4,-amp)..(per/2,0){curl 0}..(3*per/4,amp)..(per,0){curl 0}) shifted (i*per,j*dec); + endfor; + endfor) shifted llcorner cadre +enddef; + + +primarydef p avec c = + begingroup + save _des_; + picture _des_; + _des_:=c; + clip _des_ to p; + _des_ + endgroup +enddef; + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%% DIVERS %%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +string LaTeX_packages[],LaTeX_preamble,LaTeX_inputenc; +LaTeX_preamble:="";LaTeX_inputenc:=""; + +numeric n_packages; +n_packages:=0; + +def LaTeX_AjoutPackage(expr t)= + if known latexmp_module: + latexmp_packages:=latexmp_packages & "," & t + else: + n_packages:=n_packages+1; + LaTeX_packages[n_packages]:=t + fi +enddef; + +def LaTeX_AjoutCommande(expr t)= + LaTeX_preamble:=LaTeX_preamble & t +enddef; + +def LaTeX_Encodage(expr t)= + LaTeX_inputenc:= t +enddef; + + + +boolean LaTeXprem; +LaTeXprem:=true; + +def LaTeXsetup = + if LaTeXprem: + LaTeXprem:=false; + latexmp_preamble:=LaTeX_preamble; + latexmp_inputenc:=LaTeX_inputenc; + if latexmp_inputenc="": latexmp_inputenc:="utf8" fi; + if latexmp_packages="": latexmp_packages:="fourier" fi; + latexmp_packages:=latexmp_packages & ",textcomp,mathtools,mathrsfs,esvect[e],siunitx[output-decimal-marker={,}],babel[frenchb]"; + latexmp_preamble:=latexmp_preamble & "\newcommand{\vect}[1]{\vv{#1}}" & "\newcommand{\calc}{\mathscr{C}}" & "\newcommand{\calp}{\mathscr{P}}" & "\DecimalMathComma" ; + fi +enddef; + +vardef LaTeX primary sc = %D'après TEX.mp + if known latexmp_module: LaTeXsetup; textext(sc) scaled defaultscale + else: + save n_p; + numeric n_p; + write "verbatimtex" to "mptextmp.mp"; + write "%&latex" to "mptextmp.mp"; + write "\documentclass[10pt]{article}" to "mptextmp.mp"; + if LaTeX_inputenc="": + write "\usepackage[utf8]{inputenc}" to "mptextmp.mp" + else: + write "\usepackage[" & LaTeX_inputenc &"]{inputenc}" to "mptextmp.mp" + fi; + write "\usepackage[T1]{fontenc}" to "mptextmp.mp"; + if known LaTeX_packages[1]: + n_p:=1; + forever: exitunless known LaTeX_packages[n_p]; + write "\usepackage{" & LaTeX_packages[n_p] &"}" to "mptextmp.mp"; + n_p:=n_p+1; + endfor + else: + write "\usepackage{fourier}" to "mptextmp.mp" + fi; + write "\usepackage{amsmath}" to "mptextmp.mp"; + write "\usepackage{mathrsfs}" to "mptextmp.mp"; + write "\usepackage[e]{esvect}" to "mptextmp.mp"; + write "\usepackage[output-decimal-marker={,}]{siunitx}" to "mptextmp.mp"; + write "\usepackage[frenchb]{babel}" to "mptextmp.mp"; + write LaTeX_preamble to "mptextmp.mp"; + write "\newcommand{\vect}[1]{\vv{#1}}" to "mptextmp.mp"; + write "\newcommand{\calc}{\mathscr{C}}" to "mptextmp.mp"; + write "\newcommand{\calp}{\mathscr{P}}" to "mptextmp.mp"; + write "\begin{document}" to "mptextmp.mp"; + write "etex" to "mptextmp.mp"; + write "btex "& sc &" etex" to "mptextmp.mp"; + write EOF to "mptextmp.mp"; + scantokens "input mptextmp" scaled defaultscale + fi +enddef; + +%%%%%%%%%%%%%%%Figure intermédiaire%%%%%%%%%%%%%%%%%%% +def figureinter= + clip currentpicture to cadre; + shipit; + _nfig:=_nfig+1; + charcode:=charcode+1; +enddef; + + +vardef arrowhead expr p = %redéfinition flèches + save q,e; path q; pair e; + e = point length p of p; + q = gobble(p shifted -e cutafter makepath(pencircle scaled 2ahlength)) + cuttings; + (q rotated .5ahangle & reverse q rotated -.5ahangle -- 0.5*(point 0 of q)-- cycle) shifted e +enddef; + +def epaisseur=withpen pencircle scaled enddef; +def couleur=withcolor enddef; + + +vardef long_texte(text t)= + save i; + numeric i; + i:=0; + for n=t: i:=i+1; endfor + i +enddef; + +vardef _chaine(suffix s)= %met les termes en indice si le 2e est un chiffre + save c,d; + string c,d; + d:= str s; + if length(d)=1: + c:=d + elseif isdigit (substring (1,2) of d): + c:= (substring (0,1) of d) & "_{" & substring (1,infinity) of d & "}" + else: c:=str s + fi; + c +enddef; + + +vardef arrondi(expr p,x)= %arrondi de x au p-ième + round((x-floor(x))*p)/p+floor(x) +enddef; + +vardef arrondimil(expr x)= + arrondi(1000,x) +enddef; + +vardef pgcd(expr a,b)= + save r_,a_,b_; + numeric r_,a_,b_; + a_=a;b_=b; + forever: + r_:=a_ mod b_; + exitif r_=0; + a_:=b_; + b_:=r_; + endfor; + b_ +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; + +Rouge:=(0,1,1,0); +Vert:=(1,0,1,0); +Bleu:=(1,1,0,0); +Marron:=(0,0.53,1,0.65); +Lime:=(0.38,0,0.78,0.01); +Orange:=(0,0.5,1,0); +Rose:=(0,0.57,0.38,0.01); +Pourpre:=(0,0.91,0.59,0.38); +Violet:=(0.5,1,0,0.4); +Cyan:=(1,0,0,0); +Magenta:=(0,1,0,0); +Jaune:=(0,0,1,0); +Olive:=(0.21,0,0.75,0.45); +Noir:=(0,0,0,1); +Grisfonce:=(0,0,0,0.75); +Gris:=(0,0,0,0.5); +Grisclair:=(0,0,0,0.25); +Blanc:=(0,0,0,0); +Beige:=(0,0.14,0.37,0.22); +Marine:=(1,1,0,0.5); +Moutarde:=(0.04,0,1,0.19); +Vertfonce:=(1,0,1,0.5); + + +vardef conversion_cmyn_rvb(expr coul)= + ((1-cyanpart coul)*(1-blackpart coul),(1-magentapart coul)*(1-blackpart coul),(1-yellowpart coul)*(1-blackpart coul)) +enddef; + +color rouge,vert,bleu,marron,lime,orange,rose,pourpre,violet,cyan,magenta,jaune,olive,noir,grisfonce,gris,grisclair,blanc,beige,marine,moutarde,vertfonce; + +rouge:=conversion_cmyn_rvb(Rouge); +vert:=conversion_cmyn_rvb(Vert); +bleu:=conversion_cmyn_rvb(Bleu); +marron:=conversion_cmyn_rvb(Marron); +lime:=conversion_cmyn_rvb(Lime); +orange:=conversion_cmyn_rvb(Orange); +rose:=conversion_cmyn_rvb(Rose); +pourpre:=conversion_cmyn_rvb(Pourpre); +violet:=conversion_cmyn_rvb(Violet); +cyan:=conversion_cmyn_rvb(Cyan); +magenta:=conversion_cmyn_rvb(Magenta); +jaune:=conversion_cmyn_rvb(Jaune); +olive:=conversion_cmyn_rvb(Olive); +noir:=conversion_cmyn_rvb(Noir); +grisfonce:=conversion_cmyn_rvb(Grisfonce); +gris:=conversion_cmyn_rvb(Gris); +grisclair:=conversion_cmyn_rvb(Grisclair); +blanc:=conversion_cmyn_rvb(Blanc); +beige:=conversion_cmyn_rvb(Beige); +marine:=conversion_cmyn_rvb(Marine); +moutarde:=conversion_cmyn_rvb(Moutarde); +vertfonce:=conversion_cmyn_rvb(Vertfonce); + |