Retour

Source : astroide.mp

astroide.mp
%======================Fonctions usuelles==========================================
numeric Pi,E;
Pi:= 3.14159;
E:= 2.71828;
 
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) =
        mexp(x*256)
enddef;
 
vardef ln(expr x) =
        mlog(x)/256
enddef;
% Définition du repère ===================================================
def repere(expr Ox,Oy,Xmin,Xmax,Ymin,Ymax,Ux,Uy) =
       % affectations des variables
	   _ox := Ox ; _oy := Oy  ; _ux := Ux ; _uy := Uy;
	   _xmin := Xmin ; _xmax := Xmax ; _ymin := Ymin ; _ymax := Ymax;
	   _r_xmin := _xmin*_ux+_ox; % l'abscisse minimale 
	   _r_xmax := _xmax*_ux+_ox; %l'abscisse maximale
	   _r_ymin := _ymin*_uy+_oy; %l'ordonnée minimale
	   _r_ymax := _ymax*_uy+_oy %l'ordonnée maximale
enddef;
 
% Placer les axes du repère ==============================================
 
def r_axes =
           drawarrow (_r_xmin,_oy)..(_r_xmax,_oy);
		   drawarrow (_ox,_r_ymin)..(_ox,_r_ymax);
		   label.bot(btex $x$ etex, (_r_xmax-1mm,_oy));
		   label.lft(btex $y$ etex, (_ox,_r_ymax-1mm))
enddef;
 
% Placer l'origine =======================================================
 
def r_origine =
             label.lft(btex $O$ etex,(_ox,_oy-2mm));
			 pickup pencircle scaled 3pt;
			 draw (_ox,_oy);
			 pickup pencircle scaled 0.5pt
enddef;
 
%Graduation des unités ===================================================
def r_unites =
             draw (_ox+_ux,_oy-1mm)--(_ox+_ux,_oy+1mm);
			 draw(_ox-1mm,_oy+_uy)--(_ox+1mm,_oy+_uy)
enddef;
 
%Définir un point dans ce plan ===========================================
def r_point(expr x,y) =
       (_ox+x*_ux,_oy+y*_uy)
enddef;
 
%Graduation des axes =====================================================
def grad_x(expr n) =
           for i=0 upto (_xmax-_xmin)/n-1:
		   draw (_r_xmin+i*n*_ux,_oy-1mm)--(_r_xmin+i*n*_ux,_oy+1mm);
		   endfor
enddef;
def grad_y(expr n) =
           for i=0 upto (_ymax-_ymin)/n-1:
		   draw (_ox-1mm,_r_ymin+i*n*_uy)--(_ox+1mm,_r_ymin+i*n*_uy);
		   endfor
enddef;
%Quadrillage===============================================================
def quad_x(expr n) =
           numeric _a,_b,_c,_d;
           _a = floor(_xmin)*_ux+_ox; _b = floor(_ymin)*_uy+_oy;
		   _c = (floor(_xmax)+1)*_ux+_ox; _d = (floor(_ymax)+1)*_uy+_oy;
		   pickup pencircle scaled 0.01pt;
           for i=0 upto (floor(_xmax)+1-floor(_xmin))/n -1:
		   draw (_a+i*n*_ux,_b)--(_a+i*n*_ux,_d);
		   endfor
		   pickup pencircle scaled 0.5pt;
		   for i=0 upto (floor(_xmax)+1-floor(_xmin)) -1:
		   draw (_a+i*_ux,_b)--(_a+i*_ux,_d);
		   endfor
 
enddef;
def quad_y(expr n) =
           numeric _a,_b,_c,_d;
           _a = floor(_xmin)*_ux+_ox; _b = floor(_ymin)*_uy+_oy;
		   _c = (floor(_xmax)+1)*_ux+_ox; _d = (floor(_ymax)+1)*_uy+_oy;
		   pickup pencircle scaled 0.01pt;
           for i=0 upto (floor(_ymax)+1-floor(_ymin))/n -1:
		   draw (_a,_b+i*n*_uy)--(_c,_b+i*n*_uy);
		   endfor
		   pickup pencircle scaled 0.5pt;
		   for i=0 upto (floor(_ymax)+1-floor(_ymin)) -1:
		   draw (_a,_b+i*_uy)--(_c,_b+i*_uy);
		   endfor
 
enddef;
%Placer un point plein dans ce repère ====================================
def r_ppoint(expr x,y) =
        pickup pencircle scaled 3pt;
        draw (_ox+x*_ux,_oy+y*_uy);
		pickup pencircle scaled 0.5pt 
enddef;
 
 
 
 
%Placer un point creux dans ce repère ====================================
def r_cpoint(expr x,y) =
        path _e;
		_e = fullcircle scaled 3pt shifted(_ox+x*_ux,_oy+y*_uy);
		draw _e;
		fill _e withcolor white
enddef;
 
%Label des unités ========================================================
def r_labelxy =
              label.bot(btex {$+1$} etex,(_ox+_ux,_oy-1mm));
			  label.lft(btex {$+1$} etex, (_ox-1mm,_oy+_uy))
enddef;
 
%Definr un segment ================================================
def r_segment(expr a,b,c,d) =
       (_ox+a*_ux,_oy+b*_uy)--(_ox+c*_ux,_oy+d*_uy)
enddef;
 
%Definir une droite // à l'axe des ordonnées =============================
def rx_droite(expr k) =
       (_ox+k*_ux,_r_ymin)--(_ox+k*_ux,_r_ymax)
enddef;
 
%Definir une droite définie par un point et son coeff dir ================
def r_droitedir(expr a,b,m) =
       (_r_xmin,_oy+(m*_xmin+b-m*a)*_uy)--(_r_xmax,_oy+(m*_xmax+b-m*a)*_uy)
enddef;
 
%Projection d'un point sur les axes ======================================
def r_point_proj(expr x,y) =
       draw(_ox+x*_ux,_oy)--(_ox+x*_ux,_oy+y*_uy)--(_ox,_oy+y*_uy) 
        dashed evenly  
enddef;
 
%On enlève ce qui sort du repère =========================================
def r_fin =
           clip currentpicture to (_r_xmin,_r_ymin)--(_r_xmin,_r_ymax)--
		   (_r_xmax,_r_ymax)--(_r_xmax,_r_ymin)--cycle
enddef;
 
%Tracer des courbes en dimension 2 =======================================
 
%definition de f
def fx(expr t) = 5*(cos(t)**3) enddef;
 
def fy(expr t) = 5*(sin(t)**3) enddef;
 
def f_point(expr t) =
    r_point(fx(t),fy(t))
enddef;
 
def f_courbe(expr ti,tf,n) =
    f_point(ti)
    for i=1 upto n:
        ...f_point(ti+(i/n)*(tf-ti))
    endfor
enddef;
 
%===========================================================================
%definition de g
def gx(expr t) = (5/sqrt(2))*(cos(t)*cos(2*t)) enddef;
def gy(expr t) = (5/sqrt(2))*(sin(t)*cos(2*t)) enddef;
def g_point(expr t) =
    r_point(gx(t),gy(t))
enddef;
def g_courbe(expr ti,tf,n) =
    g_point(ti)
    for i=1 upto n:
	...g_point(ti+(i/n)*(tf-ti))
    endfor
enddef;
 
%===========================================================================
 
astroide.mp (figure 1)
beginfig(1);
path p,q;
repere(0,0,-6,6,-6,6,1cm,1cm);
quad_x(0.1);
quad_y(0.1);
r_axes;
r_origine;
r_unites;
grad_x(1);
grad_y(1);
r_labelxy;
p = f_courbe(0,7,100);
q = g_courbe(0,7,100);
draw p withcolor red withpen pencircle scaled 1.2pt;
draw q withcolor blue withpen pencircle scaled 1.2pt;
r_fin;
endfig;
end