Une cardioïde qui roule ...
Jean-Michel Sarlat (jsarlat@planete.net) - 14 novembre 2002Se 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 |
Source index.txt mouliné par petitParseur(Z+B) le mardi 19 novembre 2002.