mardi 17 décembre 2013

Dessins d'épicycloides avec Scilab

Peut être avez joué au spirographe quand vous étiez petits ? Ce jeux consiste en un assortiment d'engrenages permettant de tracer des épicycloides  : courbe obtenue  à partir d'un crayon attaché à un cercle (appelé épicycle)  roulant sans glissement le long d'un autre cercle.  Ce type de courbe est un excellent moyen pour trouver des problèmes intéressants  à base de courbes paramétrées et de fonctions trigonométriques!   Voici quelques exemples   dessinés avec scilab :
Le code de base pour dessiner une telle courbe est le suivant :

function epicycloid(R,r,N)
    //R= diametre du cercle  fixe
    //r= diamètre de l'épicycle
    //N=nombre de tours
    d=R+r;//distance du centre de l'épicycle à celui du cercle fixe
    L=max(d+r+1,R+1) //  largeur de la fenêtre
    x=[];y=[];
    for t=[0:0.1:int(2*%pi*10*N)/10, 2*%pi*N]
        drawlater
        clf
        trace_repere(-L,-L,L,L,color('grey'))
        trace_cercle(0,0,R,2)
        angle=t*d/r;// angle du point sur l'épicycle 
        x=[x;d*cos(t)-r*cos(angle)];
        y=[y;d*sin(t)-r*sin(angle)];
        plot(x,y,'-g')// épicycloïde
        e=gce(),e.children.thickness=2
        plot([d*cos(t),x($)],[d*sin(t),y($)],'-k')
        trace_cercle(d*cos(t),d*sin(t),r,5)
        plot(d*cos(t),d*sin(t),'k')//centre du cercle épicycle
        plot(x($),y($),'r')// dernier point de l'épicycloïde
        drawnow 
    end
endfunction
ou j'utilise deux macros personnelles : une pour tracer tracer les cercles en donnant juste leur centre, leur rayon et la couleur :
function trace_cercle(x,y,r,couleur)
    // cercle de rayon r
    // de centre (x,y)
    xarc(x-r,y+r,2*r,2*r,0,360*64)
    e=gce(),e.thickness=2,e.foreground=couleur
endfunction
une autre pour tracer un repère cartésien à partir de sa taille L :
function trace_repere(xmin,ymin,xmax,ymax,couleur)
    clf
    xgrid(couleur)
    A=gca()
    A.data_bounds=[xmin,ymin;xmax,ymax]
    A.isoview="on"
    A.x_location="origin"
    A.y_location="origin"
endfunction
Une fois chargé ces trois fonctions dans Scilab, le premier tracé s'obtient  juste en tapant dans la console de scilab la commande :
--> epicycloid(3,1,1)

L'épicycloïde la plus simple consiste à faire rouler un petit cercle  (de rayon r) à l'extérieur d'un grand cercle (de rayon R). Dans le cas particulier ou R=r on obtient alors  une cardioide :


Cardioïde pour R=r=2

Si le rapport des deux rayons est rationnel on obtiendra une courbe fermée (en forme de pétales de fleurs) mais si le rapport des deux rayon est irrationnel alors la courbe obtenue ne se refermera jamais et remplira  la couronne comprise entre les cercles de rayons R et R+2r. 

R=3 et $r=\sqrt{2}$
 Mais on peut aussi faire rouler le petit cercle à l'intérieur du grand cercle comme ci-dessous :
R=3 et r=-1
En prenant le rayon r<0  on a même pas besoin de modifier le code de la fonction epicycloid ! Là encore on a pris un rapport rationnel entre le rayon des deux cercles   pour obtenir une courbe fermée. Une petite modification du principe de tracé consistant  à placer le crayon n'importe où sur le  rayon  du cercle rouge (qui apparaît en noir)  et non pas juste  sur le cercle rouge lui même   on obtient alors toute une gamme de dessins du type de ceux générés par un spirographe :

4 commentaires:

  1. Merci pour ce post. Je l'ai trouvé très intéressant.

    RépondreSupprimer
  2. Bonjour Philippe!
    Merci beaucoup pour ce script, avez-vous vu la vidéo de ElJJ (Jérôme) sur les épycicloïdes (2 minutes pour convaincre)? On peut grâce à votre script et en calculant des coefficients de Fourier correspondant à un dessin donné, réaliser des Pokemon, Homer Simpson ou même des éléphants.

    RépondreSupprimer
  3. Merci pour ce site bien expliqué,c'est vraiment très intéressant et beau ce qui ne gâte

    RépondreSupprimer
  4. Ce commentaire a été supprimé par un administrateur du blog.

    RépondreSupprimer

Pour écrire des formules mathématiques vous pouvez utiliser la syntaxe latex en mettant vos formules entre des "dollars" $ \$....\$ $ par exemple :
- $\sum_{n=1}^\infty {1\over n^2}={\pi^2\over 6}$ s'obtient avec \sum_{n=1}^\infty {1\over n^2}={\pi^2\over 6}
- $\mathbb R$ s'obtient avec {\mathbb R} et $\mathcal D$ s'obtient avec {\mathcal D}
- pour les crochets $\langle .,. \rangle$ dans les commentaires utilisez \langle .,. \rangle
vous pouvez écrire du html dans les commentaires :
- italique <i> ... </i> gras <b> ... </b>
- lien <a href="http://adresse "> .... </a>