Une cardioïde qui roule ...

Jean-Michel Sarlat (jsarlat@planete.net) - 14 novembre 2002

Se représenter la trajectoire du point de rebroussement d'une cardioïde qui roule sans glisser sur une droite ne manque pas de piquant. Les calculs sont simples et surtout c'est l'occasion d'apprécier, une fois de plus, MetaPost pour la facilité avec laquelle on peut illustrer ce mouvement.

Une figure pour commencer

Fichier : trajectoire1.mp


input courbes;

vardef rvecteur(expr x,y) = (x,y) xscaled unitex yscaled unitey enddef;
vardef fx(expr t) = (1-cosd(t))*cosd(t) enddef;
vardef fy(expr t) = (1-cosd(t))*sind(t) enddef;

path cardioide;
beginfig(1);
% Le repère à priori
repere(15cm,15cm,4cm,2cm,1cm,1cm); 

% Le chemin définissant la cardioïde
cardioide := ftrace(0,360,100) en_place;

% La base de roulement
draw ((-3,0)--(11,0)) en_place
       withpen pencircle scaled 2pt;
% La cardioïde qui roule et la trajectoire du point de
% rebroussement.       
for i=0 upto 36:
  draw cardioide rotatedaround (rpoint(fx(10*i),fy(10*i)),-(15*i)) 
         shifted rvecteur(4*(1-cosd(5*i))-fx(10*i),-fy(10*i));
  draw rpoint(0,0) rotatedaround (rpoint(fx(10*i),fy(10*i)),-(15*i)) 
         shifted rvecteur(4*(1-cosd(5*i))-fx(10*i),-fy(10*i))
         withpen pencircle scaled 4pt withcolor red;
endfor;
endfig;
end

Les fichiers : courbes.mp (HTML) -- trajectoire1.mp

La détermination

La figure

Fichier : demonstration.mp


input courbes;

vardef rvecteur(expr x,y) = (x,y) xscaled unitex yscaled unitey enddef;
vardef fx(expr t) = (1-cosd(t))*cosd(t) enddef;
vardef fy(expr t) = (1-cosd(t))*sind(t) enddef;
def en_mouvement (expr t) =
    rotatedaround (rpoint(fx(t),fy(t)),-t*1.5) 
    shifted rvecteur(4*(1-cosd(.5*t))-fx(t),-fy(t))
enddef;
def avec_aspect(expr t,c) =
    withpen pencircle scaled t withcolor c
enddef;
path cardioide,arc;
numeric t;

beginfig(1);
% Le repère à priori
repere(15cm,15cm,4cm,2cm,1cm,1cm); 

% Le chemin définissant la cardioïde
cardioide := ftrace(0,360,100) en_place;

% La base de roulement
draw ((-3,0)--(11,0)) en_place
       withpen pencircle scaled 2pt;

% La cardioïde en t=0
draw cardioide;
% La cardioïde en t
t:=130;
draw cardioide en_mouvement(130);
dotlabel.ulft(btex $O$ etex,(0,0) en_place);
dotlabel.bot(btex $M$ etex,(4*(1-cosd(.5*t)),0) en_place);
dotlabel.ulft(btex $M_0$ etex,(fx(t),fy(t)) en_place);
% L'arc de cardioïde entre le point de rebroussement et le
% point de contact.
arc := ftrace(0,t,50) en_place;
% --> au début
draw arc avec_aspect(2pt,green);
% --> à l'instant t
draw arc en_mouvement(t) avec_aspect(2pt,green);
% Le repère de Frenet
picture frenet;
frenet  = image(
    drawarrow ((0,0)--(1,0)) en_place withcolor red;
    drawarrow ((0,0)--(0,1)) en_place withcolor red;
);
draw frenet rotatedaround (rpoint(0,0),1.5*t) 
     shifted rvecteur(fx(t),fy(t));
draw frenet shifted rvecteur(4*(1-cosd(.5*t)),0);
    
endfig;
end

Le fichier : demonstration.mp

Les calculs

La trajectoire du point de rebroussement

Fichier : trajectoire2.mp


input courbes;
vardef fx(expr t) = 4-(5-cosd(t))*cosd(t/2) enddef;
vardef fy(expr t) = (1-cosd(t))*sind(t/2) enddef;

path trajectoire;
beginfig(1);
% Le repère à priori
repere(15cm,15cm,4cm,2cm,1cm,1cm); 

% Le chemin définissant la trajectoire de O
trajectoire := ftrace(0,360,100) en_place;

% La base de roulement
draw ((-3,0)--(11,0)) en_place
       withpen pencircle scaled 2pt;

draw trajectoire
         withpen pencircle scaled 4pt withcolor red;
endfig;
end

Le fichier : trajectoire2.mp

L'animation

Elle est obtenue en adaptant un peu le code de la première figure.

Fichier : trajectoire.mp


input courbes;

vardef rvecteur(expr x,y) = (x,y) xscaled unitex yscaled unitey enddef;
vardef fx(expr t) = (1-cosd(t))*cosd(t) enddef;
vardef fy(expr t) = (1-cosd(t))*sind(t) enddef;
% Le repère à priori
repere(15cm,15cm,4cm,2cm,1cm,1cm); 
% Le chemin définissant la cardioïde
path cardioide;
cardioide := (ftrace(0,360,100)..cycle) en_place;
% Le cadre de la figure
path cadre;
cadre := ((-3,-2)--(11,-2)--(11,4)--(-3,4)--cycle) en_place;
for i=0 upto 36:
  beginfig(i+1);
  fill cadre withcolor .6*white;
  draw ((-3,0)--(11,0)) en_place
       withpen pencircle scaled 2pt;
  fill cardioide rotatedaround (rpoint(fx(10*i),fy(10*i)),-(15*i)) 
         shifted rvecteur(4*(1-cosd(5*i))-fx(10*i),-fy(10*i))
         withcolor red+green;
  draw rpoint(0,0) rotatedaround (rpoint(fx(10*i),fy(10*i)),-(15*i)) 
         shifted rvecteur(4*(1-cosd(5*i))-fx(10*i),-fy(10*i))
         withpen pencircle scaled 4pt withcolor red;
  endfig;         
endfor;
end
Voir l'animation
Source index.txt mouliné par petitParseur(Z+B) le mardi 19 novembre 2002.