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 :

[Tkinter] Collision de lignes


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut [Tkinter] Collision de lignes
    Bonjour à tous,

    J'ai créé 2 lignes qui tournent et je voudrais savoir qd elles rentrent en collision. J'ai aucune idée sur le sujet tous vos conseils me seront utiles.

    merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    2 lignes qui tournent !?
    Boost ftw

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    Excuse je complete la description :
    c'est en fait deux lignes qui pivotent par rapport a une de leur extrémité. vu qu'elles tourne a des vitesses différentes et n'ont pas la meme longuer elles vont se rentrer dedans au bout d'un moment. Je voudrais savoir si il y a une commande qui peut renseigner sur une eventuelle collision entre deux ligne ou entre deux objet.
    merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Points : 10 067
    Points
    10 067
    Par défaut
    Si tu ne précises par la bibliothèque graphique utilisée, ce sera dur.

    http://www.developpez.net/forums/vie...ight=collision ?

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    en fait c'est sous tkinter
    c'est assez interressant mais ca ne fonctionne qu'avec des formes pleines type rond, carré...
    Le probleme avec les collisions de lignes c une collision possible en tout point de cette ligne et donc le calcul par rapport au centre marche pas dans ce cas la.
    je me sert de create_line pour l'afficher ensuite mais estce qu'il va falloir que je definisse l'équation des deux droites et verifier si elles ont des point commun?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    ta de la chance, justement, c'est sur qoui, je refrechits ( pour faits un jeux ,100%Tkinter)
    oui, il y aun moyen, de savoi, si l'element 1, va ou a toucher l'element 2
    je vais te laisser chercher un peut, car sa ma prits +++++++++ de temps
    aide

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    aide
    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
    def da():
        c.move(1,1,0)
        c.move(2,-1,0)
        a   =c.bbox(1)
        b   =c.bbox(2)
     
        print c.find_enclosed(a[0]-5,a[1]-5,a[2]+5,a[3]+5)
        fen.after(50,da)
     
     
    from Tkinter import*
    fen =Tk()
    c=Canvas()
    c.grid()
    c.create_text(0,50,text="a")     
    c.create_text(300,50,text="b")  
    da()
    fen.mainloop()
    regarde ta sorti de console,

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    pas mal ca doit pouvoir m'aider

    je vous tiens au courant

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    si tu veutx, je peut te dailler le scripts, si ta du mal a comprendre

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    bon je suis toujours pas arrivé
    je suis aller voir la definition du find_enclosed(x1,y1,x2,y2)
    les coordonnées doivent definir un rectangle mais comment se construit il?
    Que definisse les x et y?
    et puis ca marche dans ton exemple vu que c'est une ligne droite mais le rectangle suivra t'il une ligne qui pivote par rapport a une des extremité?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    rappellle,
    dans un fenetres cavas, chaque elements, afficher, lui est affecter, un nureros, celonts l'orde entrees, dans le scripts

    .find_enclosed(x1,y1,x2,y2) , oui c'est un rectangle
    defini, la zonne, dans le cavas, ou il ya un elements, si no il sorte () si oui, il sorte (x,),
    c'est comme un vise, qui de dit oui il y a queque chose, devants lui (x) un ou pluiseur chose (x,x,x,x,x,) image, text, carrer, rectangle, line...., ou no ()
    il ya aussi .find_closest, lui, il indique, si il ya un elements a se point

    dans mon exemple
    j'utulise .bbox(1) pour connaitres les coodornne, instantanner de la lettres "a", le 1 est dornner par canvas, car l'ordres, que j'ai mit etaits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c.create_text(0,50,text="a")     
    c.create_text(300,50,text="b")
    que sauve sur la variable dans a, qui me donne sous la forme d'une liste (10,20,3,25)
    que j'envoits sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print c.find_enclosed(a[0]-5,a[1]-5,a[2]+5,a[3]+5)
    le -5, que tu voits, on peut dire, que c'est la precition, de la dection du colison
    Il noust sorte du (1,), juste a la colision de "b", qui nous sorte (1,2,)
    sa veut dire, que 1 et 2, sont ensemble 1="a" et 2="b"

    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
     
    def da():
        c.move(1,1,0)       #deplace le 1(la lettres a), de 1x et 0y
        c.move(2,-1,0)     #depla le 2(b), de -1x,0y
        a   =c.bbox(1)     #recuper la taille et emplacement de 1(a)
        b   =c.bbox(2)     #idem, juste pour faire beaux
     
       #rechercher se qui contients, comment elements sur se retacque, qui et en mouvements, avec le 1(a), et affiche sa sorti
        print c.find_enclosed(a[0]-5,a[1]-5,a[2]+5,a[3]+5)    
        fen.after(50,da)         #veut apres 50ms, retourne sur def da
     
     
    from Tkinter import*
    fen =Tk()
    c=Canvas()
    c.grid()
    c.create_text(0,50,text="a")       #le nombre 1 luis et doner automatiquement
    c.create_text(300,50,text="b")   #le nombre 2 "  " " " "
    da()
    fen.mainloop()
    oui, sa marche dans touts les mouvements les plus foux,
    comemnt, j'essai, de faire un boobman, avec cette methode

    si no envoits moi ton code,

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    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
    def da():
        c.move(1,1,0)
        c.move(2,-1,0)
        a   =c.bbox(1)
     
        #dessinner le rectangle
        c.coords(3,a[0]-5,a[1]-5,a[2]+5,a[3]+5)
        d   =c.find_enclosed(a[0]-5,a[1]-5,a[2]+5,a[3]+5)
        print d
        if d!=(1,):
            print d,'toucher'
        fen.after(50,da)
     
     
     
    from Tkinter import*
    fen =Tk()
    c=Canvas()
    c.grid()
    c.create_text(0,50,text="a")     #1
    c.create_text(300,50,text="b")      #2
    c.create_rectangle(0,0,0,0)     #3
    da()
    fen.mainloop()
    j'ai ajouter, les ligne
    pour voir le rectangle desinner autour de la lettre a
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c.create_rectangle(0,0,0,0)     #3
     c.coords(3,a[0]-5,a[1]-5,a[2]+5,a[3]+5)

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    alors ca marche pas dans mon cas de figure car le rectangle qui se forme est trop grand et ne colle pas au pivot que je veux.
    il prend l'origine de mon pivot puis son extremité et effectue les projeté pour tracé le rectangle ce qui va pas du tout

    Mon but est d'afficher un message dans une petit fenetre disant qu'il y a collision entre les deux pivots.
    je te donne un version allégé de mon programme pour que tu comprenne comment ca marche.
    Si tu connais la solution pour reperer la collision entre les deux merci d'avance de m'expliquer comment.
    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
     
    from Tkinter import *
    from math import *
    import time, string
    import threading
    import sys
     
    def transfo_ang(angle_degre):
        angle_radian=angle_degre*pi/180
        return angle_radian
     
    class MyPivot:
        def __init__(self, orgX, orgY, longueur,  angleBut1, angleDeg, angleBut2, w, sens_rotation, epaisseur, couleur):      #sens_rotation:  taper trigo ou antitrigo 
            self.orgX = orgX                                                                                                                                  #w est exprimé en deg/s                                                                              
            self.orgY = orgY                                                                                                                                  #angleDeg, angleBut1, angleBut2 en degré (angleBut1<angleBut2)
            self.epaisseur = epaisseur
            self.couleur = couleur
            self.longueur = longueur
            self.angleDeg = angleDeg
            self.w = w
            angleRad = transfo_ang(self.angleDeg)
            self.angleBut1 = angleBut1
            self.angleBut2 = angleBut2
            self.extX=self.longueur*cos(angleRad)+orgX
            self.extY=-self.longueur*sin(angleRad)+orgY
            self.ligne=None
            self.sens_rotation=sens_rotation
            if sens_rotation == 'antitrigo':
                self.sens=-1
            else :
                self.sens=1 
     
        def inverse_sens(self):
            if (self.angleBut1 != None) & (self.angleBut2 != None):
                if (self.angleDeg >= self.angleBut2):
                    self.angleDeg=self.angleBut2
                    self.sens=-self.sens
                if (self.angleDeg <= self.angleBut1):
                    self.angleDeg=self.angleBut1
                    self.sens=-self.sens
     
        def afficher(self, windowParent):
            windowParent.delete(self.ligne)
            self.ligne=windowParent.create_line(self.orgX,self.orgY,self.extX,self.extY, width=self.epaisseur, fill=self.couleur)
     
        def rotation(self, nouvelAngle):
            self.angleDeg = nouvelAngle
            self.inverse_sens()
            self.angleRad = transfo_ang(self.angleDeg)
            self.extX=self.longueur*cos(self.angleRad)+self.orgX
            self.extY=-self.longueur*sin(self.angleRad)+self.orgY
     
    class MyWindow(Canvas):
        def __init__(self, boss, longueur, largeur):
            Canvas.__init__(self, width = longueur, height = largeur)
            self.longueur = longueur
            self.largeur = largeur
            self.create_line(2,2,2,100, width=2, fill='black', arrow=LAST)
            self.create_line(2,2,100,2, width=2, fill='black', arrow=LAST)
     
    def move():
            delta_t=500  #tps de rafraichissement exprimé en ms 
            myPivot1.afficher(myWindow1)
            myPivot2.afficher(myWindow1)
            myPivot1.rotation(myPivot1.angleDeg + myPivot1.sens*(myPivot1.w*delta_t/1000))
            myPivot2.rotation(myPivot2.angleDeg + myPivot2.sens*(myPivot2.w*delta_t/1000))
            fen.after(delta_t, move)
     
    if __name__ == '__main__': 
        fen =Tk()
        fen.title("deux pivots")
        myWindow1 = MyWindow(fen, 800, 600)
        myPivot1 = MyPivot(400, 300, 290, None, 130, None, 2, 'trigo', 3, 'yellow')
        myPivot2 = MyPivot(25, 25, 300, 280, 290, 350, 2, 'antitrigo', 3, 'green')
        move()
        myWindow1.pack(side=LEFT)
        fen.mainloop()

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    j'y travaille dessus,
    a periorits, ma methode ne marche pas sur ton scripts ;(

  15. #15
    Membre habitué Avatar de duplo
    Inscrit en
    Octobre 2004
    Messages
    294
    Détails du profil
    Informations personnelles :
    Âge : 35

    Informations forums :
    Inscription : Octobre 2004
    Messages : 294
    Points : 172
    Points
    172
    Par défaut
    en fait pour que cela puisse fonctionner correctement il faudrait pouvoir definir un poligone plutôt qu'un rectangle
    si non tu peut utiliser .find_closest si tu range tes point dans un tableau avec une boucle sa devrait etre assé rapide a verifier
    +
    pensez au

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    Je suis parti sur une autre méthode hier qui consiste a creer 4 droites pour encadrer un pivot et avec une condition qui analyse les coordonnées de l'extremité de l'autre pivot pour savoir si elle est dans la zone defini par les 4 droites.
    Je fini de tester ca et je vous montrerai le code.
    Si vous avez trouvé une autre solution un peu moins lourde je veux ien la regarder

  17. #17
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    et merci de m'aider !!!!

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 57
    Points : 71
    Points
    71
    Par défaut

    ton scripts est beaux, et tres compliques, avec touts ces variables a rallonge,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def afficher(self, windowParent):
            windowParent.delete(self.ligne)
            self.ligne=windowParent.create_line(self.orgX,self.orgY,self.extX,self.extY, width=self.epaisseur, fill=self.couleur)
    pour def afficher,
    utuliser pour redessiner la ligne, et ça le deplacer en même temps

    si no, pour ma methodes (.find_....) ne marche pas tros dans ton cas
    le nom de ta Cavans n'a pas le meme nom,

    , il faudras, refaits le scripts, et plus allerger, et plus lineaires en retirrants les class
    desoler je ne peuts pas tros d'aide ;(

  19. #19
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 17
    Points : 3
    Points
    3
    Par défaut
    Ok merci qd meme , j'ai reussi a effectuer la detection avec l'encadrement des pivots et ca marche tres bien meme si c'est un peu lourd et compliqué.
    si tu veux le voir je te le posterai
    autrement merci de tout l'interet que tu as porté a mon probleme.
    @+

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 57
    Points : 71
    Points
    71
    Par défaut
    si t'as reusir , c'est bon signe
    faist voir, le nouveux scpits
    np

Discussions similaires

  1. Menu sur une seule ligne (Tkinter)
    Par Spitfire 95 dans le forum Tkinter
    Réponses: 5
    Dernier message: 19/02/2010, 19h32
  2. Collision entre un cercle et une ligne
    Par Happy dans le forum Physique
    Réponses: 1
    Dernier message: 21/03/2009, 15h47
  3. [Tkinter] Créer une ligne en pointillée
    Par frky dans le forum Tkinter
    Réponses: 5
    Dernier message: 05/01/2006, 19h04
  4. [Tkinter] collision
    Par duplo dans le forum Tkinter
    Réponses: 5
    Dernier message: 23/12/2005, 14h56
  5. [Tkinter] Un entry a plusieurs lignes
    Par mcdonald dans le forum Tkinter
    Réponses: 4
    Dernier message: 20/11/2005, 22h57

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