|
De plus, on remarque que la vitesse de rotation n'est pas identique selon l'endroit de la trajectoire où la masselotte se trouve : elle est rapide lorsque la masselotte est au milieu (c'est à dire vers la position verticale), et ralentie lorsque la masselotte est proche des extrêmes de sa trajectoire. Ce qui est conforme à la réalité physique de l'oscillation d'un pendule.
Télécharger le .dir commenté correspondant à cette étape de l'exercice (bouton droit -> enregistrer la cible) |
Pour limiter la
trajectoire de notre masselotte à un arc de cercle, nous aurions pu penser
à un dispositif similaire à celui que nous avions utilisé
pour notre balle. A savoir que nous aurions pu nous doter d'un sens de rotation,
puis incrémenter notre angle d'écart jusqu'à un certain
point, et ensuite le décrémenter jusqu'à l'autre point
extrême de la trajectoire, et ainsi de suite.
Cela aurait certainement marché. Mais alors, notre
mouvement aurait été uniforme entre les positions limites
et notre pendule n'aurait pas été conforme à la réalité
physique.
D'une manière générale, pour modéliser tous les mouvements et phénomènes périodiques, il faut penser à utiliser une fonction sinusoïdale, laquelle croît ou décroît très vite au milieu de son amplitude, puis arrive à ses valeurs extrêmes en fort ralenti, jusqu'à inverser son sens de variation (voir les rappels sur les lignes trigonométriques).
L'utilisation d'une telle fonction sinusoïdale que nous allons faire ici va servir à "moduler" notre angle d'écart, de manière à ce que cet angle d'écart varie entre deux valeurs limites (rappelons qu'une fonction sinusoïdale varie entre -1 et 1), que nous appellerons "amplitude". Cette amplitude, multipliée par le sinus d'un autre angle (qui lui, décrira les 360° du cercle), variera entre les valeurs +amplitude et -amplitude.
En d'autres termes,
un angle (que nous pourrons appeler "angle moteur"), incrémenté
éternellement, va fournir, par l'intermédiaire de son sinus, une
valeur oscillant entre -1 et +1, et cette valeur va servir de coefficient à
une amplitude de l'oscillation du pendule.
Pour disposer de cet angle moteur, il va donc falloir nous doter d'une nouvelle
propriété, que nous appellerons naturellement "angleMoteur".
Mais que devient notre angle
d'écart de l'étape précédente ?
Dans l'étape précédente, nous incrémentions cet
angle d'écart de manière à obtenir un mouvement circulaire
autour du point d'accroche du pendule. Comme pour toute opération d'incrémentation,
il nous fallait conserver le souvenir de sa valeur d'une fois sur l'autre, pour
pouvoir ajouter un petit quelque chose à la valeur précédente.
Nous avions donc mis l'angle d'écart en propriété.
Mais désormais, cet angle d'écart va devenir une valeur calculée
à chaque fois, sur la base d'une amplitude (fixe), multipliée
par un coefficient variant entre -1 et +1, coefficient fourni par le sinus de
l'angle moteur. Et nous pouvons écrire que :
lAngleDecart = amplitude x sinus(angleMoteur)
L'angle d'écart n'a donc plus lieu d'être une propriété, puisque, calculé à chaque fois, nous n'avons nul besoin de nous souvenir de sa valeur. Nous n'aurions pas d'erreur en le conservant en propriété et notre pendule fonctionnerait parfaitement. Mais ce serait une faute de logique dans la mesure où cet angle d'écart est le résultat d'un phénomène et non une donnée initiale caractérisant un objet (comme l'amplitude ou la longueur de la ficelle). Ce serait en outre une mauvaise gestion de la machine puisque nous mobiliserions ainsi de la mémoire de manière permanente pour stocker une valeur calculée dont le souvenir n'est pas nécessaire (*). lAngleDecart n'est donc plus une propriété et devient une simple variable locale dans la méthode osciller().
En ce qui concerne
l'amplitude, nous pourrions décider, une fois pour toute de sa valeur,
et coder le calcul ci-dessus sous la forme : lAngleDecart = 45 x sinus(angleMoteur)
– si nous décidons que l'amplitude du pendule est de 45 ° –.
Mais que se passerait-il alors si nous souhaitions faire varier l'amplitude,
soit par un réglage de l'utilisateur, soit dans le temps pour avoir par
exemple un pendule amorti. Nous ne le pourrions pas.
L'amplitude sera donc mise également en propriété.
Ensuite de quoi,
il ne nous reste qu'à convertir lAngleDecart en radians comme
précédemment et de s'en servir pour le mouvement circulaire de
la masselotte, sur la portion de cercle de l'amplitude. Reste également
à faire s'incliner la ficelle de l'angle d'écart. Le signe - est
dû au fait que les rotations sont comptées dans Director dans le
sens trigonométrique inverse. Si nous ne mettions pas ce signe -, notre
ficelle oscillerait en opposition de phase avec la masselotte.
Notre méthode osciller() devient :
on
osciller me
lAngleDecart = amplitude
* sin(angleMoteur)
a = lAngleDecart * 0.0174533
sprite(spriteNum).locH
= centreH + rayon * sin(a)
sprite(spriteNum).locV
= centreV + rayon * cos(a)
sprite(12).rotation = -lAngleDecart
angleMoteur = angleMoteur
+ .0174533
end
Notez que cette fois, c'est l'angle moteur qui est incrémenté éternellement.
* A ce propos, on pourrait s'interroger sur l'angle moteur, lequel représente le temps qui passe, pour savoir s'il s'agit d'une caractéristique intrinsèque de l'objet pendule. Non bien sûr : il s'agit d'une donnée générale qui s'applique à tout objet existant. Mais nous l'avons pourtant mis en propriété du pendule. Il aurait été plus juste, toujours du point de vue de la logique, de mettre cet angle moteur en variable globale de l'animation. Mais comme la modélisation informatique nous permet de déroger à nombre de règles physiques, nous pouvons très bien imaginer que le temps soit différent pour plusieurs pendules, et c'est la raison pour laquelle on a maintenu l'angle moteur en propriété.
| Retour vers la deuxième étape |