MetaPost / La strophoïde

strophoide.mp

Animation flash

strophoide.mp [ source brut ]

 input courbes; 
 vardef fx(expr t) = 
  2*cos(2*t) 
 enddef; 
 vardef fy(expr t) = 
  2*cos(2*t)*tan(t) 
 enddef; 
 
 % valeur utilisée pour le paramètrage.
 numeric PI;
 PI := 3.1;
 
 
 vues := 60;
 for vue=1 upto vues:
     beginfig(vue);
 	repere(11cm,18cm,5.5cm,9cm,2cm,2cm); 
  
 	% marque.unites(1mm); 
  
 	numeric t; 
 	path rayon,cercle; 
 	pair A,B,P,O,Q; 
  
 	t = -PI/2 + (vue-1)*PI/2/(vues-1); 
 	A = (2,0); 
 	O = (0,0); 
  
 	if vue=1: 
     	    Q = (2,3*r_ymax); 
 	    P = (fx(t+PI/2),fy(t+PI/2)); 
 	elseif vue=vues: 
 	    Q = (fx(t),fy(t)); 
 	    P = (2,3*r_ymin); 
 	else: 
 	    Q = (fx(t),fy(t)); 
 	    P = (fx(t+PI/2),fy(t+PI/2)); 
 	fi 
  
 	B = .5[P,Q]; 
 	rayon = 2[B,A]--2[A,B]; 
  
 	if vue=1: 
 	% rien ! 
 	elseif vue=vues: 
 	    drawarrow ftrace(-1.4,1.4,100) en_place 
 		withpen pencircle scaled 1.5pt 
 		withcolor 0.2[blue,red]; 
 	else: 
 	    draw fullcircle 
 		scaled (2*abs(O-B)*unite) 
 		shifted (B en_place) 
 		withpen pencircle scaled 1pt 
 		withcolor 0.3white; 
 	    drawarrow ftrace(-1.4,t-0.01,100) en_place 
 		withpen pencircle scaled 1.5pt 
 		withcolor 0.2[blue,red]; 
 	    drawarrow ftrace(0,t-0.01+Pi/2,100) en_place 
 		withpen pencircle scaled 1.5pt 
 		withcolor 0.2[blue,red]; 
 	fi 
  
 	% Tracé du rayon 
 	draw rayon en_place; 
  
 	% Points 
 	draw A en_place withpen pencircle scaled 5pt 
 	    withcolor blue; 
 	draw P en_place withpen pencircle scaled 5pt 
 	    withcolor blue; 
 	draw B en_place withpen pencircle scaled 5pt 
 	    withcolor blue; 
 	draw Q en_place withpen pencircle scaled 3pt; 
  
 	label.llft(btex $A$ etex scaled 2,A en_place); 
 	label.llft(btex $B$ etex scaled 2,B en_place); 
  
 	decoupe.repere; 
 	trace.axes(0.5pt); 
  
 	etiquette.axes; 
  
 	dotlabel.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 1.5pt 
 		withcolor (0.8,0.6,0.1);
     endfig;
 endfor
 
 end

 

[haut]

courbes.mp

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 : 4 avril 2007 (0.08s - 3947698 - jeudi 8 janvier 2009) vers le haut