%Tracé de courbes %courbes.mp %Christophe Poulain %création : 17 Avril 2003 %dernière modification : 12 Décembre 2003 %---------------------------------------------------------- input format; init_numbers(btex $-$ etex, btex$1$etex, btex$ times 10$etex, btex$"" sup -$etex, btex$"" sup 2$etex); %Définiton Metapost path Cb[],Cpa[],Cpo[],Cpopa[]; %Constantes pi:=3.141592654; e:=2.718281828; c:=57.29578; % conversion d'un radian en degrés color rouge,vert,bleu,jaune,noir,blanc,orange,rose,violet,ciel,orangevif,gris; rouge=(1,0,0); bleu=(0,0,1); noir=(0,0,0); blanc=(1,1,1); orange=(1,0.5,0); violet=(0.9,0.1,0.9); rose=(1,0.7,0.7); ciel=0.9*(0.25,1,1); orangevif=(1,0.25,0.1); vert=(1,1,1)-violet; jaune=(0.9,0.9,0.2); gris=0.8*white; %%Marquage string marque_re; marque_re:= "non"; color marque_co; marque_co:=gris; %%Marquage d'un point def marquepoint(expr p)= draw (p shifted (cm*(-1/20,1/20)))--(p shifted (cm*(1/20,-1/20))); draw (p shifted(cm*(-1/20,-1/20)))--(p shifted (cm*(1/20,1/20))); enddef; %--------------- %Définition de "fonctions de base" %--------------- vardef sin(expr t) = sind(c*t) enddef; vardef cos(expr t) = cosd(c*t) enddef; vardef tan(expr t) = sin(t)/cos(t) enddef; vardef exp(expr t) = e**t enddef; vardef ch(expr x)=(exp(x)+exp(-x))/2 enddef; vardef sh(expr x)=(exp(x)-exp(-x))/2 enddef; vardef ln(expr t) = mlog(t)/256 enddef; vardef arcsin(expr x)=%Définition mathématique en radian pi*angle((sqrt(1-x**2),x))/180 enddef; vardef arccos(expr x)=%Définition mathématique en radian pi*angle((x,sqrt(1-x**2)))/180 enddef; %--------------- %Macros de traçage %--------------- %---courbe y=f(x) vardef courbe[](expr a,b,nb)(text texte)= path $; for i:=0 upto nb : x@[i]:=(a+i*(b-a)/nb); x:=x@[i]; y@[i]:=texte; endfor ; Cb@:=(x@.0*x.u,y@.0*y.u) for i:=1 upto nb : ..(x@[i]*x.u,y@[i]*y.u) endfor; Cb@:=Cb@ shifted (z.origine*cm); $=Cb@; $ enddef; %---courbe (x(t),y(t)) vardef param[](expr a,b,nb)(text texte)= path $; for i:=0 upto nb : t@[i]:= (a+i*(b-a)/nb) ; t:=t@[i]; x@[i]:=xpart(texte); y@[i]:=ypart(texte); endfor; Cpa@:= (x@.0*x.u,y@.0*y.u) for i:=1 upto nb : ..(x@[i]*x.u,y@[i]*y.u) endfor; Cpa@:=Cpa@ shifted (z.origine*cm); $=Cpa@; $ enddef; %---courbe rho=f(theta) vardef polaire[](expr a,b,nb)(text texte)= path $; for i:=0 upto nb : t@[i]:= (a+i*(b-a)/nb) ; theta:=t@[i]; x@[i]:=(texte)*cos(theta); y@[i]:=(texte)*sin(theta); endfor; Cpo@:= (x@.0*x.u,y@.0*y.u) for i:=1 upto nb : ..(x@[i]*x.u,y@[i]*y.u) endfor; Cpo@:=Cpo@ shifted (z.origine*cm); $=Cpo@; $ enddef; %---courbe rho=f(t),theta=g(t) vardef polaireparam[](expr a,b,nb)(text texte)= path $; for i:=0 upto nb : t@[i]:=(a+i*(b-a)/nb); t:=t@[i]; rho:=(pi/2)*xpart(texte); theta:=2*ypart(texte); x@[i]:=rho*cos(theta); y@[i]:=rho*sin(theta); endfor; Cpopa@:=(x@.0*x.u,y@.0*y.u) for i:=1 upto nb : ..(x@[i]*x.u,y@[i]*y.u) endfor; Cpopa@:=Cpopa@ shifted (z.origine*cm); $=Cpopa@; $ enddef; %paramètres de traçage et papier millimétré vardef cadre(expr q,r)= z.so=q; z.ne=r; path limite; limite:=z.so*cm--(x.ne*cm,y.so*cm)--z.ne*cm--(x.so*cm,y.ne*cm)--cycle; extra_endfig := "clip currentpicture to limite;" & extra_endfig; enddef; vardef origine(expr p)= x.origine=xpart(p); y.origine=ypart(p); enddef; vardef unites(expr q,r)= x.u:=q*cm; y.u:=r*cm; enddef; vardef millimetrepourcourbe= save $; picture $; numeric hauteur, largeur ; path p[]; %horizontale p1:=(x.so*cm, 0)--(x.ne*cm, 0); %verticale p2:=(0,y.so*cm)--(0,y.ne*cm); $=image( %grille penta-centimétrique %horizontales pickup pencircle scaled 1; for i:=y.so step 5 until y.ne : draw p1 shifted (0,i*cm); endfor; %verticales for i:=x.so step 5 until x.ne : draw p2 shifted (i*cm,0); endfor; %grille centimétrique pickup pencircle scaled 0.7; %horizontales for i:=y.so step 1 until y.ne: draw p1 shifted (0,i*cm); endfor; %verticales for i:=x.so step 1 until x.ne : draw p2 shifted (i*cm,0); endfor; %grille demi-centimétrique pickup pencircle scaled 0.4; %horizontales for i:=y.so step 0.5 until y.ne: draw p1 shifted (0,i*cm); endfor; %verticales for i:=x.so step 0.5 until x.ne : draw p2 shifted (i*cm,0); endfor; %grille millimétrique pickup pencircle scaled 0.2; %horizontales for i:=y.so step 0.1 until y.ne : draw p1 shifted (0,i*cm); endfor; %verticales for i:=x.so step 0.1 until x.ne : draw p2 shifted (i*cm,0); endfor; ); $ enddef; vardef axes= save ax; picture ax; path axehor,axever; axehor=(x.so*cm,y.origine*cm)--(x.ne*cm,y.origine*cm); axever=(x.origine*cm,y.so*cm)--(x.origine*cm,y.ne*cm); ax=image( drawarrow (x.so*cm,y.origine*cm)--(x.ne*cm,y.origine*cm) withpen pencircle scaled 1.5bp; drawarrow (x.origine*cm,y.so*cm)--(x.origine*cm,y.ne*cm) withpen pencircle scaled 1.5bp; label.llft(btex $O$ etex,(x.origine*cm,y.origine*cm)); ); ax enddef; %graduation des axes vardef graduationx(expr unitex,unix) = label.bot(unitex,z.origine*cm+(unix*x.u,0)); marquepoint(z.origine*cm+(unix*x.u,0)); enddef; vardef graduationy(expr unitey,uniy) = label.lft(unitey,z.origine*cm+(0,uniy*y.u)); marquepoint(z.origine*cm+(0,uniy*y.u)); enddef; vardef graduantx@#= for k=floor((x.so*cm-x.origine*cm)/x.u) upto floor((x.ne*cm-x.origine*cm)/x.u): if k<>0: dotlabel.@#(format("%10f",k),placepoint(k,0)); fi; endfor; enddef; vardef graduanty@#= for k=floor((y.so*cm-y.origine*cm)/y.u) upto floor((y.ne*cm-y.origine*cm)/y.u): if k<>0: dotlabel.@#(format("%10f",k),placepoint(0,k)); fi; endfor; enddef; %légende des axes vardef legendex(expr legx)= label.llft(legx,(x.ne*cm,y.origine*cm)); enddef; vardef Legendex@#(expr legx)= label.@#(legx,(x.ne*cm,y.origine*cm)); enddef; vardef legendey(expr legy)= label.lrt(legy,(x.origine*cm,y.ne*cm)); enddef; %%18 Avril vardef Projectiona(expr pp)= save h,$; pair h; picture $; $=image( h - pp=whatever*(z.origine*cm - (z.origine*cm+(1*x.u,0))) rotated 90; h=whatever[z.origine*cm+(1*x.u,0),z.origine*cm]; draw pp--h dashed evenly; ); $ enddef; vardef Projectiono(expr pp)= save h,$; pair h; picture $; $=image( h - pp=whatever*(z.origine*cm - (z.origine*cm+(0,1*y.u))) rotated 90; h=whatever[z.origine*cm+(0,1*y.u),z.origine*cm]; draw pp--h dashed evenly; ); $ enddef; %%19 Avril def enplace= xscaled x.u yscaled y.u shifted (z.origine*cm) enddef; vardef placepoint(expr q,r)= (q,r) enplace enddef; vardef Projection(expr pp)= save h,k,$; pair h,k; picture $; $=image( h - pp=whatever*(z.origine*cm - (z.origine*cm+(1*x.u,0))) rotated 90; h=whatever[z.origine*cm+(1*x.u,0),z.origine*cm]; k - pp=whatever*(z.origine*cm - (z.origine*cm+(0,1*y.u))) rotated 90; k=whatever[z.origine*cm+(0,1*y.u),z.origine*cm]; draw k--pp--h dashed evenly; ); $ enddef; %%21 Avril vardef hachuragecourbe(expr chemin, angle, ecart, trace)= save $; picture $; path support; support=((cm*(-37,0))--(cm*(37,0))) rotated angle; if trace=1: drawoptions(dashed evenly); elseif trace=2: drawoptions(dashed dashpattern(on12bp off6bp on3bp off6bp)); fi; $=image( for j=-200 upto 200: %if ((support shifted (ecart*j*(cm,0))) intersectiontimes chemin)<>(-1,-1): draw support shifted (ecart*j*(cm,0)); %fi endfor; ); clip $ to chemin; drawoptions(); $ enddef; vardef entrecourbes(expr aa,bb)= save $; picture $,figure; pair pti[]; path parcour[]; n:=0; for k=0 upto 100: if ((subpath(k/100*length aa,(k+1)/100*length aa) of aa) intersectiontimes bb)<>(-1,-1): n:=n+1; pti[n]:=(subpath(k/100*length aa,(k+1)/100*length aa) of aa) intersectionpoint bb; fi; endfor; if n>1: parcour1:=aa cutbefore ((xpart(pti[1]),y.so*cm)--(xpart(pti[1]),y.ne*cm)) cutafter ((xpart(pti[n]),y.so*cm)--(xpart(pti[n]),y.ne*cm)); parcour2:=bb cutbefore ((xpart(pti[1]),y.so*cm)--(xpart(pti[1]),y.ne*cm)) cutafter ((xpart(pti[n]),y.so*cm)--(xpart(pti[n]),y.ne*cm)); parcour3:=parcour1--(reverse parcour2)--cycle; if marque_re="hachure": $=image( draw hachuragecourbe(parcour3,60,0.25,0); ); elseif marque_re="remplis": figure:=currentpicture; currentpicture:=nullpicture; $=image( fill parcour3 withcolor marque_co; draw figure; ); fi; fi; $ enddef; marque_tan=25; %Dessin de la tangente en cartésien vardef tangente[](expr abscisse)= save $; picture $; pair ptt,tangent; t:=(((abscisse*x.u+x.origine*cm)-xpart(point 0 of Cb@))/(xpart(point (length Cb@) of Cb@)-xpart(point 0 of Cb@)))*length Cb@; ptt:=point t of Cb@; tangent:=unitvector(direction t of Cb@); $=image( drawdblarrow (ptt shifted (-marque_tan*tangent))--(ptt shifted (marque_tan*tangent)); marquepoint(ptt); ); $ enddef; vardef parahor(expr yh)= axehor shifted (0,yh*y.u) enddef; vardef paraver(expr xh)= axever shifted (xh*x.u,0) enddef; %Repérage d'un point en cartésien vardef pointcourbe[](expr abscisse)= save $; pair $; t:=(((abscisse*x.u+x.origine*cm)-xpart(point 0 of Cb@))/(xpart(point (length Cb@) of Cb@)-xpart(point 0 of Cb@)))*length Cb@; $=point t of Cb@; $ enddef; %hachurage de l'aire sous la courbe comprise entre x=a et x=b en cartésien vardef airesouscourbe[](expr a,b,coul)= save $; picture $,figure; path contourage; contourage:=placepoint(a,0)--(Cb@ cutbefore paraver(a) cutafter paraver(b))--placepoint(b,0)--cycle; if marque_re="hachure": $=image( draw hachuragecourbe(contourage,120,0.25,1); draw placepoint(a,0)--pointcourbe@(a); draw placepoint(b,0)--pointcourbe@(b); ); elseif marque_re="remplis": figure:=currentpicture; currentpicture:=nullpicture; $=image( fill contourage withcolor coul; draw figure; draw placepoint(a,0)--pointcourbe@(a); draw placepoint(b,0)--pointcourbe@(b); ); fi; $ enddef; vardef grille(expr t)= save gri; picture gri; path p[]; %horizontale p1:=(x.so*cm, 0)--(x.ne*cm, 0); %verticale p2:=(0,y.so*cm)--(0,y.ne*cm); %options pickup pencircle scaled 0.5; %drawoptions(withcolor gris); gri=image( %horizontales for i:=y.so step t until y.ne: draw p1 shifted (0,i*cm); endfor; %verticales for i:=x.so step t until x.ne : draw p2 shifted (i*cm,0); endfor; ); gri enddef; %%22 Avril vardef pointparam[](expr parametre,depart,arrivee)= save $; pair $; $=point((parametre/(arrivee-depart))*length Cpa@) of Cpa@; $ enddef; vardef tangenteparam[](expr parametre,depart,arrivee)= save $; picture $; pair ptt,tangent; t:=(parametre*length Cpa@)/(arrivee-depart); tangent:=unitvector(direction t of Cpa@); ptt:=pointparam@(parametre,depart,arrivee); $=image( drawdblarrow (ptt shifted(-25*tangent))--(ptt shifted(25*tangent)); marquepoint(ptt); ); $ enddef; vardef depart(expr q,r,p,s,t)= cadre(q,r); origine(p); unites(s,t); enddef; vardef pointpolaireparam[](expr parametre,depart,arrivee)= save $; pair $; $=point((parametre/(arrivee-depart))*length Cpopa@) of Cpopa@; $ enddef; vardef tangentepolaireparam[](expr parametre,depart,arrivee)= save $; picture $; pair ptt,tangent; t:=(parametre*length Cpopa@)/(arrivee-depart); tangent:=unitvector(direction t of Cpopa@); ptt:=pointpolaireparam@(parametre,depart,arrivee); $=image( drawdblarrow (ptt shifted(-25*tangent))--(ptt shifted(25*tangent)); marquepoint(ptt); ); $ enddef; %24 Avril vardef pointpolaire[](expr parametre,depart,arrivee)= save $; pair $; $=point((parametre/(arrivee-depart))*length Cpo@) of Cpo@; $ enddef; vardef tangentepolaire[](expr parametre,depart,arrivee)= save $; picture $; pair ptt,tangent; t:=(parametre*length Cpo@)/(arrivee-depart); tangent:=unitvector(direction t of Cpo@); ptt:=pointpolaire@(parametre,depart,arrivee); $=image( drawdblarrow (ptt shifted(-25*tangent))--(ptt shifted(25*tangent)); marquepoint(ptt); ); $ enddef; %Distance dans le repère donné vardef distance(expr aa,bb)=abs((xpart(aa)/x.u,ypart(aa)/y.u)-(xpart(bb)/x.u,ypart(bb)/y.u)) enddef; %Labelisation d'une courbe cartésienne vardef labelise@#(expr a)(suffix pos)= save se; picture se; numeric t; pair pt,tangent; if str pos ="" : t:=0.5*length Cb@# else : t:=pos*length Cb@# fi; pt:=point t of Cb@#; tangent:=unitvector(direction t of Cb@#); se=image( label(a rotated angle(tangent),pt+2mm*(tangent rotated 90)); ); se enddef; %Décembre 2003 string pos; pos:="non"; vardef regionplan[](expr angle, ecart, type)(text texte)= save omega; picture omega; path close,droi; omega=image( aaa:=xpart(z.so)-xpart(z.origine); bbb:=xpart(z.ne)-xpart(z.origine); draw courbe@(aaa,bbb,100,texte); droi:=Cb@; if pos="sup": close:=(point(0) of droi)--(x.so*cm,y.ne*cm)--z.ne*cm--(point(length droi) of droi)--cycle; draw hachuragecourbe(close, angle, ecart, type); elseif pos="inf": close:=(point(0) of droi)--z.so*cm--(x.ne*cm,y.so*cm)--(point(length droi) of droi)--cycle; draw hachuragecourbe(close, angle, ecart, type); fi; ); omega enddef; vardef labelplan@#(expr a)(suffix posi)= save se; picture se; numeric t; pair pt,tangent; if str posi ="" : t:=0.5*length Cb@# else : t:=posi*length Cb@# fi; pt:=point t of Cb@#; tangent:=unitvector(direction t of Cb@#); se=image( if pos="inf": label(a rotated angle(tangent),pt+2mm*(tangent rotated 90)); elseif pos="sup": label(a rotated angle(tangent),pt-2mm*(tangent rotated 90)); fi; ); se enddef; %mai 2004 def replace= xscaled (1/x.u) yscaled (1/y.u) shifted (-z.origine*cm) enddef; def retrouvecoord(expr p)=%trasnforme les coordonnées du point d'affixe p dans le repère absolu de metapost en les coordonnées du point dans le repère défini par l'utilisateur p replace enddef; vardef intersectioncourbes(expr aa,bb)= pair pti[]; n:=0; for k=0 upto 100: if ((subpath(k/100*length aa,(k+1)/100*length aa) of aa) intersectiontimes bb)<>(-1,-1): n:=n+1; pti[n]:=(subpath(k/100*length aa,(k+1)/100*length aa) of aa) intersectionpoint bb; fi; endfor; enddef; endinput;