IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Tkinter Python Discussion :

Définition vitesse de mouvement et .after


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Définition vitesse de mouvement et .after
    Bonjour à tous.

    J'ai un petit soucis avec un programme. Il s'agit en fait d'un exercice du livre de Gérard Swinnen(ex:8.28)

    Dans la partie code du code ci-dessous il suffit juste de répondre à "une balle se déplace au hasard sur un canevas, à vitesse faible". Je me suis ajouté personnellement "à vitesse constante" et la est mon soucis.

    Je suis parti du principe que ma vitesse est de 7.07 pixels/50ms. Je pense donc à faire un simple rapport entre les pixels à parcourir et cette vitesse.
    Sauf que j'ai l'impression que ma vitesse au final n'est pas constante...
    Je me permets donc de faire appel à vos avis.

    Ci-dessous le code en question.

    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
     
    from tkinter import *
    from random import randint
    from math import sqrt
    import os
     
    def bouger():
    	global x, y, sensX, sensY, vitesse, dx, dy, flag
    	x , y = x+dx*sensX, y+dy*sensY
    	if x < 10:
    		x = 10
    		sensX = 1
    		dx = randint(1,5)
    		dy = randint(1,5)
    	if y < 10:
    		y = 10
    		sensY = 1
    		dx = randint(1,5)
    		dy = randint(1,5)
    	if x > 290:
    		x = 290
    		sensX = -1
    		dx = randint(1,5)
    		dy = randint(1,5)
    	if y > 290:
    		y = 290
    		sensY = -1
    		dx = randint(1,5)
    		dy = randint(1,5)
     
    	vitesse = int((sqrt(dx*dx + dy*dy)*50)/sqrt(5*5+5*5))
     
    	can.coords(oval, x-5, y-5, x+5, y+5)
    	os.system('clear')
    	print("dx = ", dx, "dy = ", dy, "vitesse = ", vitesse, "distance =", sqrt(dx*dx + dy*dy))
     
     
    	if flag > 0:
    		flag = 1
    		fen.after(vitesse, bouger)
     
     
    def go():
    	global flag
    	if flag == 0:
    		flag = 1
    		bouger()
     
    def arret():
    	global flag
    	flag = 0
     
     
    x, y = 10, 10
    dx, dy = 5, 5
    flag = 0
    vitesse = 50
    sensX, sensY = 1, 1
     
    fen = Tk()
     
    can = Canvas(fen, height = 300, width = 300, bg= "grey")
    can.pack(side = LEFT, padx = 5, pady= 5)
    oval = can.create_oval(x-5, y-5, x+5, y+5, fill = "red")
    bou1 = Button(fen, text="Démarrer", command=go)
    bou1.pack()
    bou2 = Button(fen, text="Arrêt", command=arret)
    bou2.pack()
     
    fen.mainloop()
    Je ne suis qu'au chap8 du livre de Gérard Swinnen, mes connaissances sont donc plutot limité.

    Merci pour votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Salut,

    Si delta=50ms est l'intervalle de temps pour appliquer le déplacement (dx, dy) à l'objet à la position (x, y), la vitesse sera distance(dx, dy) / delta (mais pourquoi la calculer ou appeler vitesse une quantité qui est un temps?).

    Normalement, lorsque l'objet rencontre un "bord", il va rebondir ce qui aboutira à inverser dx ou dy suivant le bord. Si à ce moment vous assignez dx, dy avec un randint, le rebond ne sera pas élastique et la "vitesse" changera.
    Si vous ne voulez pas que la vitesse change, pourquoi écrire ce code?

    - W

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour.

    Si delta=50ms est l'intervalle de temps pour appliquer le déplacement (dx, dy) à l'objet à la position (x, y), la vitesse sera distance(dx, dy) / delta (mais pourquoi la calculer ou appeler vitesse une quantité qui est un temps?).
    delta = 50ms est une valeur référence pour un deplacement de dx=5 et dy=5, soit la plus grande distance possible. Si dx=2 et dx=3 (simple exemple), le déplacement est moindre dans le laps de temps de 50ms, la vitesse est donc plus petite non?
    dx=5, dy=5 correspond à une distance de 7,07 en 50ms
    dx=2, dy=3 correspond à une distance de 6,06 en 50ms, donc vitesse moindre

    Appeler le delta t "vitesse" est effectivement peu approprié, juste un nom que je n'ai pas changé.

    Normalement, lorsque l'objet rencontre un "bord", il va rebondir ce qui aboutira à inverser dx ou dy suivant le bord. Si à ce moment vous assignez dx, dy avec un randint, le rebond ne sera pas élastique et la "vitesse" changera.
    Si vous ne voulez pas que la vitesse change, pourquoi écrire ce code?
    On en revient au même que ci-dessus je pense. Concrétement, la balle se déplace à une vitesse variable suivant dx, dy si le delta T reste fixe. Je pensais donc à adapter le delta T suivant la distance à parcourir et ainsi garder une vitesse constante.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Citation Envoyé par Bystren Voir le message
    Concrétement, la balle se déplace à une vitesse variable suivant dx, dy si le delta T reste fixe. Je pensais donc à adapter le delta T suivant la distance à parcourir et ainsi garder une vitesse constante.
    Le delta correspond à une vitesse de rafraîchissement: c'est une sorte de "frames per seconds". Elle doit avoir une valeur entre 20 et 50 (fps) pour que l’œil humain voie un déplacement "continu".

    Je ne sais pas ce que vous voulez faire mais, en première approximation, le vecteur de déplacement (dx, dy) de la balle ne devrait changer qu'après collision.

    - W

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Oui, dx et dy ne change (par randint() ) qu'à chaque collision.

    Je cherche à faire déplacer "la balle" à vitesse constante peut importe le rand sur dx et sur dy. Si je maintient mon delta T à une valeur fixe, cette vitesse n'est pas constante si j'ai bien compris le principe de after qui exécute une fonction après un laps de temps.

    Si on fait un rand sur une fourchette de 1 à 20 on s’aperçoit bien que plus le rand est proche de 20 plus la balle se déplace rapidement. Je cherche donc à éviter cette variation de vitesse.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 442
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 442
    Points : 37 034
    Points
    37 034
    Par défaut
    Citation Envoyé par Bystren Voir le message
    Si on fait un rand sur une fourchette de 1 à 20 on s’aperçoit bien que plus le rand est proche de 20 plus la balle se déplace rapidement. Je cherche donc à éviter cette variation de vitesse.
    "delta" étant constant - la vitesse de rafraîchissement de l'affichage n'a pas à changer - il peut être utilisé comme unité de temps.
    A partir de la si vous voulez conserver la vitesse après une collision non élastique: i.e. modifier dx (ou dy) via randint, il faut calculer le dy (ou dx) correspondant pour que...
    - W

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    effectivement en adaptant dx ou dy plutôt que d'ajuster le delta me permet de garder une vitesse constante.

    Merci pour ton aide, je passe le topic en résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] windows phone 8.1 map controler vitesse du mouvement
    Par minosys dans le forum Windows Phone
    Réponses: 2
    Dernier message: 11/05/2015, 16h21
  2. définition d'un profil de route et d'un profil de vitesse
    Par Nathaniel_etudiant dans le forum Simulink
    Réponses: 3
    Dernier message: 08/11/2010, 16h01
  3. Problème d'effets de vitesse sur After Effect
    Par JJules dans le forum Vidéo
    Réponses: 0
    Dernier message: 19/07/2010, 13h47
  4. Définition de "Métalangage"
    Par No dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 19/07/2002, 15h05
  5. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 21h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo