Retour

Source : courbescp13.mp

courbescp13.mp
%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;