Bonjour, je vous remercie d'ava,ce pour votre aide.
Mon problème est le suivant : je suis étudiant et je suis sensé programmer en python la chute d'une balle seulement ce que j'ai fait jusqu'à present ne marche pas vraiment comme je le voudrais.
Pourriez vous me dire ce qu'il ne va pas?(j'ai mis en rouge les points précis ou je pense qu'il y a un probleme). Désolé pour la présentation...


Vecteurs :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
class Vecteur :
  def __init__(self, _x=0.0, _y=0.0):
    self.x = _x
    self.y = _y
 
  def mulScalaire(self, _fScalaire):
    self.x *= _fScalaire
    self.y *= _fScalaire
 
  def addVecteur(self, _vVecteur):
    self.x += _vVecteur.x
    self.y += _vVecteur.y
Balle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
from Vecteur import *
 
class Balle:
  def __init__(self, _x=0.0, _y=0.0,\
               _rayon=10.0, _masse=10.0,\
               _xVitesse=0.0, _yVitesse=0.0):
    self.mPosition=Vecteur(_x, _y)
    self.mVitesse=Vecteur(_xVitesse, _yVitesse)
    self.mRayon=_rayon
    self.mMasse=_masse
projet:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
 
from Tkinter import *
from Balle import *
 
 
def marche():
  calculer()
  dessiner()
  global marche
  marche=1
 
def arret():
  global marche
  marche=0
 
def calculer():
  global ballesPassees
  ballesPassees=[ Balle(_x=derniereBalle.mPosition.x,\
                               _y=derniereBalle.mPosition.y,\
                               _rayon=derniereBalle.mRayon,\
                               _masse=derniereBalle.mMasse,\
                               _xVitesse=derniereBalle.mVitesse.x,\
                               _yVitesse=derniereBalle.mVitesse.y)]
 
  global fGravite, iIntervalleTempsMS, fIntervalleTemps
  fGravite=-9.8
  iIntervalleTempsMS=100
  fIntervalleTemps=iIntervalleTempsMS * 0.001
 
  global iIndexTemps
  iIndexTemps=0
 
  while derniereBalle.mPosition.x < fResolutionHorizontale \
    and derniereBalle.mPosition.x > 0.0 \
    and derniereBalle.mPosition.y > 0.0 \
    and iIndexTemps < 10000:
 
    derniereBalle.mVitesse.y += fGravite * fIntervalleTemps
 
    tempVitesseAAppliquer = Vecteur(derniereBalle.mVitesse.x, derniereBalle.mVitesse.y)
    tempVitesseAAppliquer.mulScalaire(fIntervalleTemps)
    derniereBalle.mPosition.addVecteur(tempVitesseAAppliquer)
 
    ajoutduneBalle = Balle(_x=derniereBalle.mPosition.x,\
                           _y=derniereBalle.mPosition.y,\
                           _rayon=derniereBalle.mRayon,\
                           _masse=derniereBalle.mMasse,\
                           _xVitesse=derniereBalle.mVitesse.x,\
                           _yVitesse=derniereBalle.mVitesse.y)
    ballesPassees.append(ajoutduneBalle)
 
 
    fenetre.coords(cercleDessinee, ballesPassees[iIndexTemps].mPosition.x - ballesPassees[iIndexTemps].mRayon,\
                                 fResolutionVerticale - (ballesPassees[iIndexTemps].mPosition.y) - ballesPassees[iIndexTemps].mRayon,\
                                 ballesPassees[iIndexTemps].mPosition.x + ballesPassees[iIndexTemps].mRayon,\
                                 fResolutionVerticale - (ballesPassees[iIndexTemps].mPosition.y) + ballesPassees[iIndexTemps].mRayon)
 
    iIndexTemps += 1
 
 
def dessiner():
  dessinerUneTrame(1)
 
 
#L AFFICHAGE DE LA BALLE NE SE MET A JOUR QU A LA FIN et pas entre chaque appel d'after, POURQUOI ?
def dessinerUneTrame(iIndexTempsAffichage):
 
  global iIntervalleTempsMS, cercleDessinee, ballesPassees, marche
  fenetre.coords(cercleDessinee, ballesPassees[iIndexTempsAffichage].mPosition.x - ballesPassees[iIndexTempsAffichage].mRayon,\
                                 fResolutionVerticale - (ballesPassees[iIndexTempsAffichage].mPosition.y) - ballesPassees[iIndexTempsAffichage].mRayon,\
                                 ballesPassees[iIndexTempsAffichage].mPosition.x + ballesPassees[iIndexTempsAffichage].mRayon,\
                                 fResolutionVerticale - (ballesPassees[iIndexTempsAffichage].mPosition.y) + ballesPassees[iIndexTempsAffichage].mRayon)
  print(ballesPassees[iIndexTempsAffichage].mPosition.x)
  print(fResolutionVerticale - (ballesPassees[iIndexTempsAffichage].mPosition.y) + ballesPassees[iIndexTempsAffichage].mRayon) #l'impression des coordonnes donne bien les bonnes valeurs
  if ( iIndexTempsAffichage < iIndexTemps and marche > 0): #si on change iIndexTemps pour par exemple arreter l'affichage de la simu a la moitie, la balle est bien affichee au bon endroit
    fenetre.after(iIntervalleTempsMS, dessinerUneTrame(iIndexTempsAffichage+1))
 
 
 
global fResolutionVerticale, fResolutionHorizontale
fResolutionVerticale=480.0
fResolutionHorizontale=640.0
 
interface=Tk()
global fenetre
fenetre=Canvas(interface,width=fResolutionHorizontale,height=fResolutionVerticale,bg='ivory')
fenetre.pack(side=TOP,padx=5,pady=5)
 
global derniereBalle
derniereBalle=Balle(_x=50.0, _y=430.0, _rayon=10.0)
global cercleDessinee
cercleDessinee = fenetre.create_oval(derniereBalle.mPosition.x-derniereBalle.mRayon,fResolutionVerticale - (derniereBalle.mPosition.y)-derniereBalle.mRayon,\
                                     derniereBalle.mPosition.x+derniereBalle.mRayon,fResolutionVerticale - (derniereBalle.mPosition.y)+derniereBalle.mRayon,outline='black')
 
bouton1=Button(interface,text='marche',command=marche)
bouton1.pack(side=LEFT,padx=5,pady=5)
bouton2=Button(interface,text='arret',command=arret)
bouton2.pack(side=LEFT,padx=20,pady=5)
interface.mainloop