MetaPost / Construction particulière de la cardioïde

Construction particulière de la cardioïde

Animation flash

animation.mp [ source brut ]

 input courbes; 
 vardef fx(expr t) = 
  (1+cos(t))*cos(t) 
 enddef; 
 vardef fy(expr t) = 
  (1+cos(t))*sin(t) 
 enddef; 
 
 vues := 96;
 for vue=1 upto vues:
 beginfig(vue);
 repere(14cm,14cm,7cm,7cm,3cm,3cm); 
  
 % marque.unites(1mm); 
  
 numeric t,u,r; 
 t = (vue-1)/(vues-1)*2*Pi; 
  
 % Tracé du cercle 
 fill fullcircle 
  scaled 2unite 
  shifted origine 
  withpen pencircle scaled 1pt 
  withcolor 0.7white; 
  
 draw fullcircle 
  scaled 2unite 
  shifted origine 
  withpen pencircle scaled 1pt 
  withcolor 0.3white; 
  
 draw ftrace(0,2*Pi,100) en_place 
  withpen pencircle scaled 1.5pt 
  withcolor (0.95,0.95,0.9); 
  
 pair A,P,Q,B,C,D,O; 
  
 A = (cos(t),sin(t)); 
 P = (cos(2*t),sin(2*t)); 
 Q = (1,0); 
 B = .5[P,Q]; 
 C = B+A; 
 D = B-A; 
 O = (0,0); 
 r = sqrt(2-2*cos(t)); 
  
 draw fullcircle 
  scaled 2unite 
  shifted (B en_place) 
  withpen pencircle scaled 1pt 
  withcolor 0.5white; 
  
 draw fullcircle 
  scaled (r*2*unite) 
  shifted (A en_place) 
  withpen pencircle scaled 1pt 
  withcolor 0.5white; 
  
  
 % Tracé de la cardioide 
 if vue=1: 
 u = 0; 
 elseif vue=vues: 
 u = t; 
 else: 
 u = t-0.05; 
 fi 
  
 drawarrow ftrace(0,u,10+10*vue) en_place 
  withpen pencircle scaled 1.5pt 
  withcolor 0.2[blue,red]; 
  
 draw (O--C) en_place; 
 draw (O--D) en_place; 
 draw (P--Q) en_place; 
 draw (O--A) en_place; 
  
  
 % Points 
 draw A en_place withpen pencircle scaled 5pt withcolor blue; 
 draw B en_place withpen pencircle scaled 5pt withcolor blue; 
 draw C en_place withpen pencircle scaled 5pt withcolor blue; 
 draw D en_place withpen pencircle scaled 5pt withcolor blue; 
 draw P en_place withpen pencircle scaled 5pt withcolor blue; 
 draw Q en_place withpen pencircle scaled 5pt withcolor blue; 
  
  
 decoupe.repere; 
 trace.axes(0.5pt); 
  
 etiquette.axes; 
  
 label(btex $A$ etex scaled 2,(1.15[O,A] en_place)); 
 label(btex $B$ etex scaled 2,((B rotated 10) en_place)); 
 label.llft(btex $O$ etex scaled 2,rpoint(0,0)); 
  
 draw rpoint(r_xmin-0.2,r_ymin-0.2)-- 
  rpoint(r_xmin-0.2,r_ymax+0.2)-- 
  rpoint(r_xmax+0.2,r_ymax+0.2)-- 
  rpoint(r_xmax+0.2,r_ymin-0.2)--cycle 
  withpen pencircle scaled 3pt 
  withcolor 0.8white;
 endfig;
 endfor
 
 end

Macros

courbes.mp [ source brut ]

 %% =====================================================================
 %% COURBES.MP
 %% Courbes 1 (8 octobre 2001)
 %% Macros pour présenter des courbes
 %% Jean-Michel Sarlat -- Mai 1997
 %% =====================================================================
 
 
 %% =====================================================================
 %% Repère et coordonnées
 %% =====================================================================
 pair origine;
 
 vardef repere(expr lx,ly,ox,oy,ux,uy) =
         % affectations
         _ox := ox ; _oy := oy ;
         _ux := ux ; _uy := uy ;
         _lx := lx ; _ly := ly ;
         origine := (_ox,_oy);
         unitex := ux;
         unitey := uy;
         unite := ux;
         r_xmin := -ox/ux;
         r_xmax := (lx-ox)/ux;
         r_ymin := -oy/uy;
         r_ymax := (ly-oy)/uy;
         _largeur_marques := 1mm;
 enddef;
 
 % Procédure de mise en place dans le repère
 def en_place =
     xscaled unitex yscaled unitey shifted origine
 enddef;
 
 % Définir un point
 vardef rpoint(expr x,y) =
         (x,y) en_place
 enddef;
 
 %% =====================================================================
 %% Construction dans le repère
 %% =====================================================================
 % Axes
 vardef trace.axes(expr t) =
         drawarrow (0,_oy)--(_lx,_oy) withpen pencircle scaled t;
         drawarrow (_ox,0)--(_ox,_ly) withpen pencircle scaled t;
 enddef;
 
 
 % Marque des unités
 vardef marque.unites(expr l) =
         draw (_ox+_ux,_oy-l)--(_ox+_ux,_oy+l);
         draw (_ox-l,_oy+_uy)--(_ox+l,_oy+_uy);
         _largeur_marques := l;
 enddef;
 
 % Labels des unités
 vardef etiquette.unites =
         label.bot(btex $+1$ etex,(_ox+_ux,_oy-_largeur_marques));
         label.lft(btex $+1$ etex,(_ox-_largeur_marques,_oy+_uy));
 enddef;
 % Grille
 vardef trace.lignes.horizontales(expr d,taille,couleur) =
        numeric ni,nf;
        ni := floor(r_ymin/d);
        nf := floor(r_ymax/d);
        for i=ni upto nf:
           draw ((r_xmin,i*d)--(r_xmax,i*d)) en_place
             withpen pencircle scaled taille
             withcolor couleur;
        endfor; 
 enddef;
 vardef trace.lignes.verticales(expr d,taille,couleur) =
        numeric ni,nf;
        ni := floor(r_xmin/d);
        nf := floor(r_xmax/d);
        for i=ni upto nf:
           draw ((i*d,r_ymin)--(i*d,r_ymax)) en_place
             withpen pencircle scaled taille
             withcolor couleur;
        endfor; 
 enddef;
 vardef trace.grille(expr d,taille,couleur) =
        trace.lignes.horizontales(d,taille,couleur);
        trace.lignes.verticales(d,taille,couleur);
 enddef;
 
 % Projeter un point sur les axes
 vardef projection.axes(expr a,taille,ecart) =
        draw ((0,ypart a)--a--(xpart a,0)) en_place
              dashed evenly scaled ecart
              withpen pencircle scaled taille
 enddef;
 
 % Tracé d'une droite parallèle à l'axe des y
 vardef parallele.axe.y(expr x) =
        draw (_ox+x*_ux,0)--(_ox+x*_ux,_ly)
 enddef;
 
 % Tracé d'une droite parallèle à l'axe des x
 vardef parallele.axe.x(expr y) =
        draw (0,_oy+y*_uy)--(_lx,_oy+y*_uy)
 enddef;
 
 % On coupe tout ce qui dépasse les limites du repère
 vardef decoupe.repere =
         clip currentpicture to (0,0)--(0,_ly)--(_lx,_ly)--(_lx,0)--cycle;
 enddef;
 
 vardef etiquette.axes =       
         label.bot (btex $x$ etex,(_lx,_oy));
         label.lft(btex $y$ etex,(_ox,_ly));
 enddef;
 
 %% =====================================================================
 %% Partie numérque
 %% =====================================================================
 
 numeric Pi;
 numeric E;
 
 Pi := 3.14159;
 E  := 2.72828;
 
 vardef sin(expr x) =
         sind(x/Pi*180)
 enddef;
 
 vardef cos(expr x) =
         cosd(x/Pi*180)
 enddef;
 
 vardef tan(expr x) =
         sin(x)/cos(x)
 enddef;
 
 vardef exp(expr x) =
         E**x
 enddef;
 
 vardef ch(expr x) =
         (E**x + E**(-x))/2
 enddef;
 
 vardef sh(expr x) =
         (E**x - E**(-x))/2
 enddef;
 
 vardef th(expr x) =
         (E**(2*x) - 1)/(E**(2*x) + 1)
 enddef;
 
 %% =====================================================================
 %% Partie fonctions
 %% Fonctions prédéfinies t -> fx(t) et y -> fy(t)
 %% =====================================================================
 numeric pas_derivation;
 
 pas_derivation := 0.01;
 
 vardef f(expr t) =
            (fx(t),fy(t))
 enddef;
 vardef dfx(expr t) =
        (fx(t+pas_derivation)-fx(t-pas_derivation))/2/pas_derivation
 enddef;
 vardef dfy(expr t) =
        (fy(t+pas_derivation)-fy(t-pas_derivation))/2/pas_derivation
 enddef;
 vardef vd(expr t) =
       unitvector((dfx(t),dfy(t)))
 enddef;
 vardef ftrace(expr ti,tf,n) =
     numeric fpas;
     fpas := (tf-ti)/n;
     f(ti)
     for i = 1 upto n:
         ..f(ti+i*fpas)
     endfor
 enddef;
 vardef trace.courbe(expr ti,tf,n,taille,couleur) =
     draw ftrace(ti,tf,n) en_place
          withpen pencircle scaled taille
          withcolor couleur;
 enddef;
 %% =====================================================================
 %% Partie équations différentielles
 %% Fonction prédéfinie (x,y) -> F(x,y)  <numeric>
 %% =====================================================================
 vardef champ.vecteurs(expr x,y,pas,dx,couleur) =
   npasxg := floor((x-r_xmin)/pas);
   npasxd := floor((r_xmax-x)/pas);
   npasyb := floor((y-r_ymin)/pas);
   npasyh := floor((r_ymax-y)/pas);
   facteur:= unite*dx;
   for i = 0 upto npasxg:
      for j = 0 upto npasyb:
        drawarrow ((0,0)--unitvector((1,F(x-i*pas,y-j*pas)))) 
                  scaled facteur
                  shifted rpoint(x-i*pas,y-j*pas)
                  withcolor couleur;
      endfor
      for j = 0 upto npasyh:
        drawarrow ((0,0)--unitvector((1,F(x-i*pas,y+j*pas))))
                  scaled facteur
                  shifted rpoint(x-i*pas,y+j*pas)
                  withcolor couleur;
      endfor
   endfor
   for i = 0 upto npasxd:
      for j = 0 upto npasyb:
        drawarrow ((0,0)--unitvector((1,F(x+i*pas,y-j*pas)))) 
                  scaled facteur
                  shifted rpoint(x+i*pas,y-j*pas)
                  withcolor couleur;
      endfor
      for j = 0 upto npasyh:
        drawarrow ((0,0)--unitvector((1,F(x+i*pas,y+j*pas)))) 
                  scaled facteur
                  shifted rpoint(x+i*pas,y+j*pas)
                  withcolor couleur;
      endfor
   endfor
 enddef;
 
 %% =====================================================================
 endinput
 %% =====================================================================
 

 

Validation CSS Validation XHTMLJean-Michel Sarlat — Dernière modification : 23 mars 2007 (0.07s - 3948187 - jeudi 8 janvier 2009) vers le haut