Cycloïdes proboscidiennes¶
Introduction¶
Le but de ce sujet est de réaliser des tracés géométriques animés très particuliers, basés sur des cycloïdes. Une cycloïde est la trajectoire parcourue par un point donné d’un cercle tournant autour de son centre. Naturellement, on peut alors extrapoler cette idée en faisant en sorte que le centre du cercle lui-même soit un point donné d’un autre cercle tournant, etc. Toutes les trajectoires décrites par de telles combinaisons sont appelées génériquement des cycloïdes. L’animation ci-dessous montre l’exemple d’une cycloïde particulière discrétisée en \(N =300\) points où
le premier cercle est centré en \((0,0)\), a pour rayon \(r_1 =100\) et tourne à la fréquence réduite \(f_1 =1\). La position angulaire initiale du point jaune est \(\Theta_1 =0.75 rad\). Cela permet d’écrire simplement les coordonnées du point jaune sur ce grand cercle comme ceci :
\[\begin{split}\begin{matrix} x_1(t) = r_1cos(2\pi.f_1.t/N + \theta_1)\\ y_1(t) = r_1sin(2\pi.f_1.t/N + \theta_1) \end{matrix}\end{split}\]le second cercle est centré en \((x_1(t),y_1(t))\), a pour rayon \(r_2 =50\) et tourne 4 fois plus vite soit à \(f_2 =4\). La position angulaire initiale du point jaune est cette fois \(\Theta_2 =1.5 rad\). Les coordonnées du point jaune sur le petit cercle s’obtiennent alors en composant les deux ensembles d’expressions paramétriques et l’on obtient
\[\begin{split}\begin{matrix} x_2(t) = x_1(t) + r_2cos(2\pi.f_2.t/N + \theta_2)\\ y_2(t) = y_1(t) + r_2sin(2\pi.f_2.t/N + \theta_2) \end{matrix}\end{split}\]
Défi n°1 : reproduire la cycloïde ci-dessus¶
La difficulté réside dans le fait de conserver la trace des positions précédentes du point dont on cherche à déterminer la trajectoire. Pour cela il faut à chaque pas de calcul
1effacer la fenêtre de dessin 2dessiner la position courante des cercles 3dessiner toutes les positions occupées par le point d'intérêt depuis l'instant t=0
À faire
Écrire un programme qui permet de tracer les cycloïdes issues de la rotation des deux cercles décrits dans l’introduction. Les positions des centres, les vitesses, angles à l’origine et rayons seront déclarés en constantes.
Correction
Défi n°2 : à deux, c’est mieux¶
L’idée est ici de découpler les abscisses et les ordonnées du point d’intérêt (en violet) dont on trace la trajectoire. Pour cela, on définit deux ensembles de cercles tournants dont l’un servira à générer les abscisses (repéré H) et l’autre les ordonnées (repéré G). La figure ci-dessous illustre cette organisation en proposant également des notations pour les vitesses et les centres des cercles, rangés dans des tableaux. Ce modèle de notation peut aussi être étendu aux autres grandeurs (angles, rayons, …).
À faire
Modifier le programme du défi n°1 pour tracer les cycloïdes générées par deux ensembles de cercles tournants. On pourra choisir deux ensembles de cercles dont l’un sera celui de l’introduction et le second, identique, mais avec les phases à l’origine \(\Theta_1 = \Theta_2 = 0\).
Défi n°3 : polymulticyclohideux¶
Naturellement, tracer ces cycloïdes simplistes ne comble pas totalement notre attirance pour les défis de taille. On se propose donc de généraliser le procédé pour pouvoir tracer n’importe quelle courbe issue de cycloïdes découplées, connaissant l’ensemble des paramètres des familles de cercles H et G.
À faire
Écrire un programme qui trace la cycloïde générée par les deux ensembles de cercles tournants dont les caractéristiques sont données par les tableaux constants ci-dessous. Il est ici nécessaire de s’organiser un minimum et d’écrire des fonctions pour bien structurer le code. Une possibilité est par exemple d’écrire :
une fonction qui calcule et trace, pour un instant t donné, l’état d’une cascade de cycloïdes et retourne les coordonnées du point final (celui qui sert à générer la trace)
une fonction qui imprime la trace déjà parcourue par le point final à l’instant t.
1 final double[] tRayonsG = {214.5, 57.6, 8.83, 50.14, 71.20, 50.25, 55.67, 64.60, 2 51.50, 22.43, 14.20, 19.89, 3.92, 15.04, 14.91, 5.50, 3 10.33, 11.80, 5.57, 4.91, 8.60, 2.60, 3.40, 1.67, 2.43, 4 5.50, 1.90, 1.67, 2.25, 7.50, 2.40, 1.33, 1.67, 3.88, 3.86, 5 0.25, 3.20, 1.05, 2.67, 1.86}; 6 final double[] tRayonsH = {390.67, 60.09, 58.88, 60.71, 30.14, 9.75, 13.90, 37.25, 25.67, 7 9.09, 16.88, 5.75, 23.75, 7.75, 6.09, 16.75, 6.05, 11.88, 16.50, 8 6.25, 2.91, 7.75, 8.10, 4.33, 3.57, 2.67, 5.80, 1.75, 5.33, 5.40, 9 2.20, 0.33, 3.25, 4.67, 1.80, 1.89, 0.33, 1.50, 1.33, 1.67}; 10 final double[] tVitG = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11 11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0, 12 21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0, 13 31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0}; 14 final double[] tVitH = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 15 11.0,12.0,13.0,14.0,15.0,16.0,17.0,18.0,19.0,20.0, 16 21.0,22.0,23.0,24.0,25.0,26.0,27.0,28.0,29.0,30.0, 17 31.0,32.0,33.0,34.0,35.0,36.0,37.0,38.0,39.0,40.0}; 18 final double[] tPhiG = {-1.053, 3.333, 2.5, 2.5, -1.0, 2.429, 3.8, 0.25, -0.1, 0.667, 19 1.2, -1.083, 2.2, 2.0, 0.143, 0.667, 0.143, -0.667, -1.0, 0.25, 20 4.333, 1.5, 2.2, -1.0, -1.5, -1.2, 4.0, -1.333, -1.333, 3.056, 21 -0.25, 0.6, 4.0, -0.091, 2.167, 3.909, 4.5, 3.833, 0.571, -0.5}; 22 final double[] tPhiH = {2.629, 1.429, -0.142, -2.571, 1.679, -0.142, -0.404, -1.571, 1.001, 23 -1.821, -1.071, 0.029, 2.429, -0.971, 0.763, -2.771, 2.679, -0.696, 24 -2.237, -2.904, 1.096, -2.142, 2.52, 1.679, -1.904, -1.821, -2.821, 25 -0.071, -2.696, -3.071, 0.929, 0.829, 2.829, 0.679, 0.029, 2.829, 26 0.572, 2.329, 1.929, 1.263};
Les dimensions de la fenêtre de dessin devront être ajustées à 1024x1024 et les échelles seront définies par les bornes suivantes
final double XMIN = -1400.0; final double XMAX = 600.0; final double YMIN = -400.0; final double YMAX = 1600.0;
Enfin, les positions des centres des cercles fixes (les premiers de chaque famille, d’indice 0) seront (-1000, 0) pour l’ensemble G et (0, 1150) pour l’ensemble H. Le nombre de pas de calcul (STEPS) sera à ajuster autour de 1000.
Correction