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 [ 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 %% =====================================================================