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

Programmation multimédia/Jeux Python Discussion :

collision entre deux boules [Python 2.X]


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre régulier Avatar de fifafou
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2016
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 173
    Points : 92
    Points
    92
    Par défaut collision entre deux boules
    Bonjour
    En ce moment je cherche a gérer des collisions entre deux boules.
    J'ai fini par trouver un moyen tout seul,n'ayant pas trouvé sur internet
    Code :un petit exemple avec Tkinter : 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
    from Tkinter import *
    from math import *
    fen=Tk()
    fen.title("boules")
    fon=Canvas(fen,height=400,width=400,bg="white")
    fon.pack()
    fen.geometry("400x400")
    fon.create_oval(150,150,250,250,fill="black")
    vr,vo=3.0,(input("angle")/90.0)*pi
    y,x=0,-200.0
    ro=fon.create_oval(x+150,y+150,x+200,y+200,fill="red")
    def running():
        global x,y,vr,vo
        fon.coords(ro,x+150,y+150,x+250,y+250)
        x+=vr*cos(vo)
        y+=vr*sin(vo)
        if x>200 or x<-200:
            vo=pi-vo
        if y>200 or y<-200:
            vo=-vo
        if x**2+y**2<10000:
        #calcul du nouvel angle
            vo=2*(atan2(y,x)+(pi/2.0))-vo
        fen.after(5,running)
    running()
    fen.mainloop()
    Mais quelqu'un a-t-il une autre technique?

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    La solution classique et de base est de prendre le centre des deux sphères, de calculer leur distance (racine carrée ((x1 - x2)² + (y1 - y2)²) et de comparer avec le radius des sphères.
    Une astuce consistera de ne pas faire la racine carrée et de comparer avec le carré du radius des sphères
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Avant de faire des calculs précis (et couteux), on fait généralement un "AABB check". AABB étant l'acronyme de axis-aligned bounding box i.e. quelque soit la figure, on prend la plus petite boîte rectangulaire qui la contient. Dans le cas de 2 cercles/disques, ce seront des carrés. On regarde alors si leur intersection est non vide i.e. s'ils se recouvrent pour "calculer".

    Pour ce faire, le canvas de TCL/Tk dispose de la méthode .bbox(ident or tag) qui retourne l'AABB sous la forme x1, y1, x2, y2 qu'on va pouvoir passer à la méthode .find_overlapping(x1, y1, x2, y2) retournant les identifiants des "items" recouverts tout en partie.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre régulier Avatar de fifafou
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2016
    Messages
    173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Janvier 2016
    Messages : 173
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    La solution classique et de base est de prendre le centre des deux sphères, de calculer leur distance (racine carrée ((x1 - x2)² + (y1 - y2)²) et de comparer avec le radius des sphères.
    Une astuce consistera de ne pas faire la racine carrée et de comparer avec le carré du radius des sphères
    Merci mais je l'ai déjà fait à la ligne 21,10000 étant 1002
    Citation Envoyé par wiztricks
    Salut,
    Avant de faire des calculs précis (et couteux), on fait généralement un "AABB check". AABB étant l'acronyme de axis-aligned bounding box i.e. quelque soit la figure, on prend la plus petite boîte rectangulaire qui la contient. Dans le cas de 2 cercles/disques, ce seront des carrés. On regarde alors si leur intersection est non vide i.e. s'ils se recouvrent pour "calculer".
    Pour ce faire, le canvas de TCL/Tk dispose de la méthode .bbox(ident or tag) qui retourne l'AABB sous la forme x1, y1, x2, y2 qu'on va pouvoir passer à la méthode .find_overlapping(x1, y1, x2, y2) retournant les identifiants des "items" recouverts tout en partie.
    Pour un polygone,c'est très utile mais pour un cercle,la première méthode est plus pratique pas très couteuse.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 062
    Points
    219 062
    Billets dans le blog
    120
    Par défaut
    Bon, alors c'est tout bon. J'ai eu peur à cause du cos/sin/atan .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

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

Discussions similaires

  1. Collision entre deux boules (glissade et non rebonds)
    Par Ephysio dans le forum Physique
    Réponses: 6
    Dernier message: 19/10/2015, 15h51
  2. collision entre deux mobiles
    Par Bastuccio dans le forum Général JavaScript
    Réponses: 17
    Dernier message: 24/09/2009, 08h36
  3. collision entre deux segments
    Par [Hugo] dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 01/04/2009, 15h48
  4. Collision entre deux rectangle
    Par Ouaibou dans le forum Mathématiques
    Réponses: 4
    Dernier message: 15/04/2007, 15h16
  5. Detection de collision entres deux cylindres.
    Par Sandro Munda dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 07/11/2006, 14h36

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