Laboratoire 3¶
Les nouvelles notions abordées dans ce laboratoire sont les suivantes:
Mathématique:
Les coniques.
La résolution d’équations du second degré.
Physique:
Le mouvement uniformément accéléré dans un espace à deux dimensions.
Programme 6: Tir balistique¶
Ce projet est une variante du jeu de tir implémenté dans le programme 2. Le canon est maintenant orientable, et tire des projectiles qui sont soumis à l’accélération de la gravité. La vitesse de ces projectiles est également réglable. La fenêtre du jeu ressemble à celle-ci:
L’angle du canon peut être réglé en appuyant sur les flèches gauche et droite. La vitesse linéaire des projectiles à la sortie du canon est affichée sur l’indicateur qui figure dans le coin inférieur gauche de la fenêtre. Cette vitesse peut être modifiée en pressant les flèches haute et basse.
Mouvement des projectiles¶
La première étape consiste à écrire la fonction responsable de calculer
le mouvement des projectiles. La démarche est très proche de celle des
programmes 2 et 3. Dans le cas présent, le projectile se déplace en deux
dimensions en étant uniquement soumis à l’accélération de la gravité.
La fonction mua_2d()
que vous devez développer est chargée de calculer
la position d’un projectile à un instant donné. Cette fonction doit:
accepter 5 arguments:
un tuple d’entiers
depart
contenant les coordonnées \((x_0, y_0)\) du canon (qui est le point de départ des projectiles). Ces coordonnées sont exprimées en pixels. Pour simplifier, on considère que le canon se résume à un seul point.un entier
temps_depart
donnant l’instant où le projectile a été émis par le canon, exprimé en millisecondes.un tuple de réels
vitesse_initiale
donnant le vecteur vitesse \((v_{0x}, v_{0y})\) du projectile à la sortie du canon. Les composantes de ce vecteur sont exprimées en pixels par milliseconde.un réel
acceleration_verticale
correspondant à l’accélération \(g\) de la gravité, exprimée en pixels par milliseconde au carré, et (bien sûr) dirigée vers le bas. (Comme l’axe \(Y\) du repère de la fenêtre est orienté de haut en bas, on a donc \(g > 0\).)un entier
temps_maintenant
donnant l’instant présent \(t\), exprimé en millisecondes. Ce temps peut être supposé supérieur ou égal àtemps_depart
.
retourner un tuple fournissant les coordonnées \((x_t, y_t)\) du projectile à l’instant \(t\).
Procédure à suivre:
Ecrire des formules exprimant \(x_t\) et \(y_t\) en fonction de \(x_0\), \(y_0\), \(v_{0x}\), \(v_{0y}\), \(g\) et \(t\).
Télécharger le programme prog-6.py.
Dans ce programme, remplacer la fonction
mua_2d()
par votre propre implémentation des formules obtenues au point 1.Vérifier que le programme fonctionne correctement. Un clic gauche de la souris permet de tirer un projectile. Un clic droit affiche une cible (que vous pouvez effacer en pressant la touche “C”).
Reporter les formules obtenues au point 1 sur votre feuille de laboratoire (Code P6-1).
Tir automatique¶
L’objectif est maintenant de calculer automatiquement la vitesse que doit
avoir le projectile à la sortie du canon, afin de toucher la cible.
Ce calcul sera implémenté dans une fonction calculer_vitesse()
possédant les caractéristiques suivantes. Cette fonction doit:
accepter quatre arguments:
un tuple d’entiers
depart
contenant les coordonnées \((x_0, y_0)\) du canon, exprimées en pixels.un réel
angle
donnant l’angle \(\theta\) que fait le canon avec l’horizontale. Cet angle est exprimé en radians. Il suit la convention trigonométrique dans le repère de la fenêtre. (Rappel: l’axe \(Y\) est orienté de haut en bas.) Selon cette convention, un angle positif correspond à un tir vers le bas (en supposant \(|\theta| < \pi\)), et un angle négatif à un tir vers le haut.un tuple d’entiers
cible
contenant les coordonnées \((x_c, y_c)\) de la cible, exprimées en pixels.un réel
acceleration_verticale
correspondant à l’accélération \(g\) de la gravité, exprimée en pixels par milliseconde au carré.
retourner une paire de valeurs:
un booléen
tir_est_possible
indiquant s’il est possible ou non de tirer un projectile qui touchera la cible.dans le cas où
tir_est_possible
est vrai, la vitesse linéaire \(v_0\) que doit avoir le projectile en sortie du canon pour toucher la cible. Cette vitesse doit naturellement être strictement positive. Elle doit être exprimée en pixels par milliseconde.
Procédure à suivre:
Ecrire la condition déterminant la valeur de
tir_est_possible
en fonction des paramètres du problème.Ecrire une formule exprimant, lorsque
tir_est_possible
est vrai, la valeur de \(v_0\) en fonction des paramètres du problème.Dans votre version courante du programme
prog-6.py
, remplacer la fonctioncalculer_vitesse()
par votre propre implémentation des formules obtenues aux points 1 et 2.Vérifier le bon fonctionnement du programme. Le calcul automatique de la vitesse peut être activé en pressant la touche “A”, après avoir désigné une cible.
Note: Si le calcul réussit, l’indicateur de vitesse devient rouge. A partir de cette situation, tous les projectiles tirés devraient atteindre leur cible (si les calculs effectués sont corrects!). Si l’on modifie une donnée du problème (angle du canon, vitesse, position de la cible), l’indicateur reprend sa couleur d’origine pour signifier que le calcul doit à nouveau être effectué. Lorsque le calcul échoue, l’indicateur garde sa couleur de base.
Reporter les formules obtenues aux points 1 et 2 sur votre feuille de laboratoire (Code P6-2).
Calcul du point d’impact¶
La dernière étape consiste à déterminer, dans le cas où la vitesse du
projectile a été calculée automatiquement, à quel endroit se situera
le point d’impact de celui-ci avec le sol. La fonction
calculer_impact()
chargée de cette opération doit:
accepter cinq arguments:
un tuple d’entiers
depart
contenant les coordonnées \((x_0, y_0)\) du canon, exprimées en pixels.un réel
angle
donnant l’angle \(\theta\) du canon avec l’horizontale, exprimé en radians.un entier
hauteur_sol
contenant la coordonnée verticale \(y_s\) du sol, exprimée en pixels.un réel
vitesse
donnant la vitesse linéaire \(v_0\) du projectile à la sortie du canon, exprimée en pixels par milliseconde.un réel
acceleration_verticale
correspondant à l’accélération \(g\) de la gravité, exprimée en pixels par milliseconde au carré.
retourner la position horizontale \(x_s\) de l’impact du projectile avec le sol, exprimé en pixels.
Procédure à suivre:
Ecrire une équation cartésienne de la courbe suivie par le projectile, dont les inconnues sont les coordonnées \((x, y)\) de celui-ci.
Calculer l’intersection de cette équation avec le sol. Si votre raisonnement aboutit à plusieurs solutions, déterminer laquelle d’entre elles correspond au point d’impact recherché. Le résultat doit prendre la forme d’une formule exprimant \(x_s\) en fonction des paramètres du problème.
Dans votre version courante du programme
prog-6.py
, remplacer la fonctioncalculer_impact()
par votre propre implémentation de la formule obtenue au point 2.Vérifier le bon fonctionnement du programme. Lors d’un tir automatique, le point d’impact prévu doit être indiqué par un fanion (s’il appartient à l’intervalle visible dans la fenêtre).
Reporter l’équation et la formule obtenues au points 1 et 2 sur votre feuille de laboratoire (Codes P6-3 et P6-4).