%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% 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): $:=_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 _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);