Il s’agit d’écrire une application interactive qui permet de lancer une balle afin de toucher une cible figée ou mobile. Les fonctionnalités fournies par le programme de gestion du mouvement de balle sont les suivantes :
|
Lorsqu’on lance un objet en l’air, hormis le cas où il est lancé verticalement, sa trajectoire est une courbe que l’on peut assimiler à une parabole :
On simule le mouvement d’une balle de masse m, dans une région où règne un champ de pesanteur uniforme. Le système étudié est la balle, modélisée par son centre B. On étudie ce mouvement dans un référentiel terrestre considéré comme galiléen muni d’un repère orthonormé de l’espace (O ; $\overrightarrow{i}$,$\overrightarrow{j}$, $\overrightarrow{k}$), choisi tel que la vitesse initiale soit dans le plan vertical (O ;$\overrightarrow{i}$,$\overrightarrow{j}$). La simulation permet de choisir un espace où règne exclusivement le champ de pesanteur uniforme. A l’instant t = 0, le point B est en O.
D’après la deuxième loi de Newton , on a : $\sum{\overrightarrow{F}}= \frac{d\overrightarrow{p}}{dt}$ avec $\overrightarrow{p}= m \overrightarrow{v}$.
La masse de la balle ne variant pas au cours du temps, on peut donc écrire : $\frac{d\overrightarrow{p}}{dt}=\frac{d(m\overrightarrow{v})}{dt}= m\frac{d\overrightarrow{v}}{dt} =m\overrightarrow{a}$ . où $\overrightarrow{a}$ est le vecteur accélération.
Or, $\sum{\overrightarrow{F}}= \overrightarrow{P}$. Donc, $m\overrightarrow{a}=m\overrightarrow{g}$ soit $\overrightarrow{a}= \overrightarrow{g}$.
Dans le repère orthonormé (O ; $\overrightarrow{i}$,$\overrightarrow{j}$,$\overrightarrow{k}$) les coordonnées du vecteur $\overrightarrow{g}$ sont $(g_{x} = 0 ; g_{y} = -g ; g_{z} = 0 )$, donc celle de $\overrightarrow{a}$ sont $(a_{x} = 0 ; a_{y} = -g ; a_{z} = 0 )$
Le vecteur accélération $\overrightarrow{a}$ est la dérivée par rapport au temps du vecteur vitesse $\overrightarrow{v}$ : $\overrightarrow{a} = \frac{d\overrightarrow{v}}{dt}$, soit :
$\frac{d\overrightarrow{v}}{dt}= a_x = 0$, $\frac{d\overrightarrow{v}}{dt}= a_y = -g$ et $\frac{d\overrightarrow{v}}{dt}= a_z = 0$. En utilisant les primitives, on a donc : $v_x = C_x$, $v_y = -gt + C_y$, $v_z = C_z$, où $C_x, C_y$ et $C_z$ sont des constantes d’intégration.
A l’instant $t = 0$, on a :$\overrightarrow{v}(C_x ; C_y ; C_z) = \overrightarrow{v}(v_{0}cos \alpha ; v_{0}sin \alpha ; 0)$ , donc, $v_x = C_x = v_{0}cos\alpha$, $v_y = -gt + v_{0}sin\alpha$ et $v_z = 0$. Or, le vecteur vitesse $\overrightarrow{v}$ est la dérivée par rapport au temps du vecteur position $\overrightarrow{OG}$ :
$\overrightarrow{v}=\frac{d\overrightarrow{OG}}{dt}$ , soit : $\frac{d\overrightarrow{x}}{dt}= v_x=v_{0}cos\alpha$, $\frac{d\overrightarrow{y}}{dt}= v_y = -gt + v_{0}sin\alpha$ et $\frac{d\overrightarrow{z}}{dt}= v_z = 0$.
En intégrant par rapport au temps t, on obtient les coordonnées du vecteur position : où g vaut environ $9,8 m.s^{-2}$. Ainsi, la position de la balle est donnée en fonction du temps t par : $\overrightarrow{OG}\begin{pmatrix}x(t) = x(0)+v_{0}\times t \times cos\alpha \\ y(t) = y(0)-\frac{1}{2}g\times t^2 + v_{0}\times t \times sin\alpha \\ 0 \end{pmatrix}$, $t \in \mathbb{R}$. Ainsi, la position de la balle est donnée en fonction du temps t par :
$\left\{ \begin{array}{ll} x(t) = x(0)+v_{0}\times t \times cos\alpha \\ y(t) = y(0)-\frac{1}{2}g\times t^2 + v_{0}\times t \times sin\alpha & t \in \mathbb{R}\\ 0 \end{array} \right.$
Dans ce projet on utilise le module Tkinter. Le projet consiste à bâtir une application autour d’un concept de menu interactif.
L’étude, étape par étape, va nous permettre de réaliser ce projet.
Il s’agit d’écrire une application interactive qui permet de lancer une balle afin de toucher une cible figée ou mobile. Les fonctionnalités fournies par le programme de gestion du mouvement de balle sont les suivantes :
|
Pour animer le déplacement de la balle, on utilise la méthode after() du module tkinter
qui va nous permettre de déclencher une fonction après un délai précisé
en millisecondes et qui a l’avantage de ne pas bloquer les autres processus (rafraîchissement de l’écran,
détection des actions de la souris ou du clavier…) en procédant de la manière suivante : fenetre.after(delai, animation).
où fenetre est le nom de la fenêtre créée dans laquelle on anime la balle.
animation est le nom de la fonction récursive animation() créée de la façon suivante :
|
# -*- coding: utf-8 -*-
from tkinter import *
import random, math
#import pygame.mixer
def animation() :
global t
# Conversion en radians de l'angle en degré.
angle = (float(angleD) / 180) * math.pi
# Calcul des coordonnées de la balle
x = force * math.cos(angle) * t + 10
y = -5 * t **2 + force * math.sin(angle) * t + 50
y = 600 - y # On "inverse" l'axe des y
# On place un point blanc et la balle
Fond.create_oval(x-2,y-2,x+2,y+2, fill = 'white', outline='white')
Fond.coords(balle, x-10,y-10,x+10,y+10)
#pygame.mixer.init()
# On teste la position de la balle :
if (Xb-x)**2 + (Yb - y)**2 < 400 :
# Si on touche la balle
Fond.create_text(400,300,text="BRAVO ", fill='black', font=("Arial",120))
B.grid_forget()
Fond.delete(balle)
#bruit=pygame.mixer.Sound('oiseau.ogg')
#bruit.play()
elif y > 550 :
# Si on touche le sol
x, y = 20, 550
Fond.coords(balle, x-10, y-10,x+10,y+10)
else :
# Sinon, on continue de faire voler la balle
t = t + 0.5
fenetre.after(50,animation)
|
# -*- coding: utf-8 -*-
def lancer():
global t, force, angleD
t = 0
force = eval(EForce.get())
angleD = eval(EAngle.get())
animation()
|
fenetre=Tk()
fenetre.title("Parabole")
# Le fond de la fenêtre de jeu
Fond=Canvas(fenetre,width=800,height=600,bg="white")
Fond.grid(columnspan = 5)
# Force du lancer
Label(fenetre,text="Force (1 à 100) : ").grid(column = 0, row = 1)
EForce = Entry(fenetre)
EForce.grid(column = 1, row = 1)
# Angle de départ
Label(fenetre,text="Angle (0 à 90) : ").grid(column = 2, row = 1)
EAngle = Entry(fenetre)
EAngle.grid(column = 3, row = 1)
# Bouton de tir
B = Button(fenetre,text='LANCER',command=lancer)
B.grid(column = 4, row = 1)
# Placement de la balle visée
Xb = random.randint(200,740)
Yb = random.randint(300,550)
balle1 = Fond.create_oval(Xb-10, Yb-10, Xb+10, Yb+10, fill='blue')
Fond.coords(balle1,Xb-10, Yb-10, Xb+10, Yb+10)
# Placement de la balle
balle = Fond.create_oval(20, 520,40,540, fill = 'red')
fenetre.mainloop()
|
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
from tkinter import *
import random, math
#import pygame.mixer
def animation() :
global t
# Conversion en radians de l'angle en degré.
angle = (float(angleD) / 180) * math.pi
# Calcul des coordonnées de la balle
x = force * math.cos(angle) * t + 10
y = -5 * t **2 + force * math.sin(angle) * t + 50
y = 600 - y # On "inverse" l'axe des y
# On place un point blanc et la balle
Fond.create_oval(x-2,y-2,x+2,y+2, fill = 'white', outline='white')
Fond.coords(balle, x-10,y-10,x+10,y+10)
#pygame.mixer.init()
# On teste la position de la balle :
if (Xb-x)**2 + (Yb - y)**2 < 400 :
# Si on touche la balle
Fond.create_text(400,300,text="BRAVO ", fill='black', font=("Arial",120))
B.grid_forget()
Fond.delete(balle)
#bruit=pygame.mixer.Sound('oiseau.ogg')
#bruit.play()
elif y > 550 :
# Si on touche le sol
x, y = 20, 550
Fond.coords(balle, x-10, y-10,x+10,y+10)
else :
# Sinon, on continue de faire voler la balle
t = t + 0.5
fenetre.after(50,animation)
def lancer():
global t, force, angleD
t = 0
force = eval(EForce.get())
angleD = eval(EAngle.get())
animation()
fenetre=Tk()
fenetre.title("Parabole")
# Le fond de la fenêtre de jeu
Fond=Canvas(fenetre,width=800,height=600,bg="white")
Fond.grid(columnspan = 5)
# Force du lancer
Label(fenetre,text="Force (1 à 100) : ").grid(column = 0, row = 1)
EForce = Entry(fenetre)
EForce.grid(column = 1, row = 1)
# Angle de départ
Label(fenetre,text="Angle (0 à 90) : ").grid(column = 2, row = 1)
EAngle = Entry(fenetre)
EAngle.grid(column = 3, row = 1)
# Bouton de tir
B = Button(fenetre,text='LANCER',command=lancer)
B.grid(column = 4, row = 1)
# Placement de la balle visée
Xb = random.randint(200,740)
Yb = random.randint(300,550)
balle1 = Fond.create_oval(Xb-10, Yb-10, Xb+10, Yb+10, fill='blue')
Fond.coords(balle1,Xb-10, Yb-10, Xb+10, Yb+10)
# Placement de la balle
balle = Fond.create_oval(20, 520,40,540, fill = 'red')
fenetre.mainloop()
|
# -*- coding: utf-8 -*-
from tkinter import *
import random, math
#import pygame.mixer
def animation() :
global t
# Conversion en radians de l'angle en degré.
angle = (float(angleD) / 180) * math.pi
# Calcul des coordonnées de la balle
x = force * math.cos(angle) * t + 10
y = -5 * t **2 + force * math.sin(angle) * t + 50
y = 600 - y # On "inverse" l'axe des y
# On place un point blanc et la balle
Fond.coords(balle, x,y)
if (Xb-x)**2 + (Yb - y)**2 < 400 :
# Si on touche la balle
Fond.create_text(400,300,text="BRAVO ", fill='black', font=("Arial",120))
B.grid_forget()
Fond.delete(balle)
#bruit=pygame.mixer.Sound('oiseau.ogg')
#bruit.play()
elif y > 550 :
# Si on touche le sol
x, y = 20, 550
Fond.coords(balle, x, y)
else :
# Sinon, on continue de faire voler la balle
t = t + 0.5
fenetre.after(50,animation)
def lancer():
global t, force, angleD
t = 0
force = eval(EForce.get())
angleD = eval(EAngle.get())
animation()
fenetre=Tk()
fenetre.title("Parabole")
# Le fond de la fenêtre de jeu
Fond=Canvas(fenetre,width=800,height=600,bg="white")
Fond.grid(columnspan = 5)
# Force du lancer
Label(fenetre,text="Force (1 à 100) : ").grid(column = 0, row = 1)
EForce = Entry(fenetre)
EForce.grid(column = 1, row = 1)
# Angle de départ
Label(fenetre,text="Angle (0 à 90) : ").grid(column = 2, row = 1)
EAngle = Entry(fenetre)
EAngle.grid(column = 3, row = 1)
# Bouton de tir
B = Button(fenetre,text='LANCER',command=lancer)
B.grid(column = 4, row = 1)
# Placement de la balle visée
Xb = random.randint(200,740)
Yb = random.randint(300,550)
panier_B = PhotoImage(file = "panier_B.gif")
panier = Fond.create_image(Xb, Yb, image = panier_B)
Fond.coords(panier,Xb, Yb)
# Placement de la balle
ballon = PhotoImage(file = "ballon_B.gif")
balle = Fond.create_image(30, 530, image = ballon)
fenetre.mainloop()