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 :

Différentes rotations !


Sujet :

Tkinter Python

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Différentes rotations !
    Bonjour, je dois créer un jeu et je suis bloqué à plusieurs endroits.

    Le but du jeu est d'aligner des arcs de trois disques concentriques. Lorsque je tourne le disque le plus petit, le 2ème disque doit tourner dans le sens inverse et le 3ème disque dans le bon sens.
    Lorsque je tourne le 2ème disque, le disque 1 reste stable et le 3ème disque tourne dans le sens inverse. Et au final lorsque je tourne le 3ème disque, les deux autres sont stables.
    J'ai trouvé pour effectuer des rotations la méthode des complexes sur http://effbot.org/zone/tkinter-complex-canvas.htm et je l'ai adapté pour pouvoir l'utiliser sur plusieurs objets.

    Voici mon code :

    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
    from tkinter import *
     
    import math
     
    # Création du widget principal ("maître") :
    fen1 = Tk()
    fen1.title("Jeu")
     
    #http://effbot.org/zone/tkinter-complex-canvas.htm
     
    def trouver_angle(event):
        dx = can1.canvasx(event.x) - center[0]
        dy = can1.canvasy(event.y) - center[1]
        try: #Si une erreur est rencontrée, on cesse d'interpréter le code et on passe aux except , qui permettent d'agir en fonction de l'erreur qui s'est produite. 
            return complex(dx, dy) / abs(complex(dx, dy)) #abs : Valeur absolue
        except ZeroDivisionError: #Empêche l'erreur de la division par zéro et renvoie 0 à la place.
            return 0.0 
     
    def press(event):
        # Calcul de l'angle à partir de start
        global start
        start = trouver_angle(event)
     
    def chaqueobjet (objet, coordonnées):
        global angle
        décalage = complex(center[0], center[1])
        newxy = []
        for x, y in coordonnées: #Dans les coordonnées du polygone
            v = angle * (complex(x, y) - décalage) + décalage
            newxy.append(v.real) 
            newxy.append(v.imag)
        can1.coords(objet, *newxy) #Change les coordonnées, *: unpack
     
    def mouvement(event):
        # Calcul de l'angle actuel par rapport à l'angle initial
        global start
        global angle
        angle = trouver_angle(event) / start
        chaqueobjet(carré1, ccarré1)
        chaqueobjet(trait1, ctrait1)
        chaqueobjet(triangle1,ctriangle1)
     
     
    # création des widgets "esclaves" :
     
    can1 = Canvas(fen1, bg='dark grey', width=400, height=400)
    can1.pack(side=BOTTOM)
     
    center = 200, 200 #Donc center[0]=200
     
    l = LabelFrame(fen1, text="Jeu", padx=20, pady=20)
    l.pack(fill="both", expand="yes")
     
    Label(l, text="Faire tourner le disque").pack(side=TOP)
     
     
    #Elements :
    cercle1 = can1.create_oval(50,50,350,350,width=2,outline='red')
    cercle2 = can1.create_oval(150,150,250,250,width=2,outline='red')
    cercle3 = can1.create_oval(100,100,300,300,width=2,outline='red')
     
    ccarré1 = [(165, 165), (185, 165), (185, 185), (165, 185)]
    carré1 = can1.create_polygon(ccarré1,tags='disque1')
     
    ctrait1 = [(165,165), (200,200)]
    trait1 = can1.create_line(ctrait1,width=2,fill='blue', tags='disque1') # Coordonnées : (x1,y1,x2,y2)
     
    ctriangle1 = [(200, 225), (225, 200), (250, 225)]
    triangle1 =can1.create_polygon(ctriangle1, fill = 'green', tags='disque1')
     
     
    ccarré2 = [(135, 135), (155, 135), (155, 155), (135, 155)]
    carré2 = can1.create_polygon(ccarré2,tags='disque2')
     
    ctrait2 = [(135,135), (165,165)]
    trait2 = can1.create_line(ctrait2,width=2,fill='blue', tags='disque2')
     
    ctriangle2 = [(125, 150), (150, 125), (175, 150)]
    triangle2 =can1.create_polygon(ctriangle2, fill = 'green', tags='disque2')
     
     
     
    can1.bind("<Button-1>", press) #click gauche
    can1.bind("<B1-Motion>", mouvement) #Mouvement de la souris avec click gauche
     
    Button(fen1,text='Quitter',command=fen1.destroy, relief=RAISED, cursor ="pirate").pack(side=BOTTOM)
     
    # démarrage du réceptionnaire d'évènements (boucle principale) :
    fen1.mainloop()
    Tout d'abord, j'aimerais si possible utiliser une seule fois la fonction chaqueobjet avec les tags, ce qui serait plus simple vu qu'à la fin il y aura plein d'objets, sauf que j'ai besoin des coordonnées de chaque objet pour pouvoir l'utiliser.
    Sinon, il y a toujours la méthode find_overlapping mais je ne vois pas comment l'utiliser dans un cercle, et encore plus difficilement entre deux cercles.

    Ensuite je veux donc inverser le rotation de D2 par rapport à D1 : quand D1 tourne, D2 soit tourner dans l'autre sens.
    Enfait, les disques ne sont pas tagués car la rotation ne marchent pas avec les disques, mais ils n'ont pas besoin de tourner puisqu'ils sont centrés.
    Ce sont donc tous les objets compris dans ces disques qui doivent effectuer la rotation.

    Sur le code, les objets compris dans D1 tournent bien autour du centre, mais je ne sais pas comment faire tourner ceux dans D2 dans l'autre sens.

    Voilà j'espère avoir été clair

    Merci d'avance!

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

    Citation Envoyé par Tony_35 Voir le message
    Voilà j'espère avoir été clair
    Pas sûr!
    Vous pourriez assigner un tag aux objets de cercle1, cercle2,... mais ce ne serait qu'une autre façon de retrouver la liste des objets dans cercleX que vous pourriez réaliser côté Python.

    Je ne comprends pas la difficulté pour la rotation "inverse".

    - W

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Pour être plus clair, on a 3 disques concentriques.
    Si on note D1, D2 et D3 les 3 disques du plus petit au plus grand:
    -Si on fait tourner D1 dans un sens (par exemple le sens horaire), D2 doit tourner dans le sens inverse (donc anti-horaire) et D3 doit tourner dans le sens (horaire).
    -Ensuite, Si on fait tourner D2 (donc si on clique sur le disque du milieu et qu'on fait un mouvement) dans un sens (ex: horaire), D1 doit rester fixe et D3 dans le sens inverse (anti-horaire)
    -Puis si on fait tourner D3, les deux autres disques restent stables.

    Le but à la fin étant d'aligner certains endroits de chaque disque pour recomposer le puzzle.


    Avec les tags, je ne voit pas comment récupérer les objets ET leurs coordonnées dont j'ai besoin.

    Pour la rotation inverse, je ne voit pas non plus comment y arriver (j'ai essayer de mettre des - un peu partout sans succès)

    Il faut donc différencier un click sur D1 d'un autre sur D2 puis d'un autre sur D3 et enfin celui qui sera en dehors des disques et qui ne fera rien. Autre problème!
    EDIT : Pour ce dernier problème, je pourrait mettre par exemple 1 carré d'une couleur spéciale sur chaque disque et faire tourner un disque pourrait se faire uniquement en cliquant sur ce carré?


    EDIT2 : J'ai trouvé pour changer la rotation! Il me reste les autres problèmes.. Voici mon code à présent :

    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
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    from tkinter import *
     
    import math
     
    # Création du widget principal ("maître") :
    fen1 = Tk()
    fen1.title("Jeu")
     
    #http://effbot.org/zone/tkinter-complex-canvas.htm
    #http://www.gigante.be/python/didact_005.php
     
    def trouver_angle(event):
        dx = can1.canvasx(event.x) - center[0]
        dy = can1.canvasy(event.y) - center[1]
        return complex(dx, dy)/ abs(complex(dx, dy)) #on a e^i0
     
    def tournerdisque1 (objet, coord):
        global angle
        décalage = complex(center[0], center[1])
        newxy = []
        for x, y in coord: #Dans les coordonnées du polygone
            v = angle * (complex(x, y) - décalage) + décalage #z=e^i0 *(z - zc) + zc
            newxy.append(v.real) 
            newxy.append(v.imag)
        can1.coords(objet, *newxy) #Change les coordonnées, *: unpack
        #return [(newxy[i], newxy[i+1]) for i in range(0,8,2)]
     
    def tournerdisque2 (objet, coord):
        global angle
        décalage = complex(center[0], center[1])
        newxy = []
        for x, y in coord: 
            v = 1/angle * (complex(x, y) - décalage) + décalage
            newxy.append(v.real) 
            newxy.append(v.imag)
        can1.coords(objet, *newxy)
     
    def tournerdisque3 (objet, coord):
        global angle
        décalage = complex(center[0], center[1])
        newxy = []
        for x, y in coord: 
            v = angle * (complex(x, y) - décalage) + décalage
            newxy.append(v.real) 
            newxy.append(v.imag)
        can1.coords(objet, *newxy)
     
    def mouvement(event):
        # Calcul de l'angle actuel par rapport à l'angle initial
        global angle
        angle = trouver_angle(event);
        disque1=[(carré1,ccarré1), (trait1,ctrait1), (triangle1,ctriangle1)];
        disque2=[(carré2,ccarré2), (trait2,ctrait2), (triangle2,ctriangle2)]
        disque3=[(carré3,ccarré3), (trait3,ctrait3), (triangle3,ctriangle3)]
        for (obj,coord) in disque1:
            tournerdisque1(obj, coord);
        for (obj,coord) in disque2:
            tournerdisque2(obj, coord)
        for (obj,coord) in disque3:
            tournerdisque3(obj, coord)
    ##    tournerdisque1(carré1, ccarré1)
    ##    tournerdisque1(trait1, ctrait1)
    ##    tournerdisque1(triangle1,ctriangle1)
     
     
    # création des widgets "esclaves" :
     
    can1 = Canvas(fen1, bg='dark grey', width=400, height=400)
    can1.pack(side=BOTTOM)
     
    center = 200, 200 #Donc center[0]=200
     
    l = LabelFrame(fen1, text="Jeu", padx=20, pady=20)
    l.pack(fill="both", expand="yes")
     
    Label(l, text="Faire tourner le disque").pack(side=TOP)
     
     
    #Elements :
    cercle1 = can1.create_oval(50,50,350,350,width=2,outline='red')
    cercle2 = can1.create_oval(150,150,250,250,width=2,outline='red')
    cercle3 = can1.create_oval(100,100,300,300,width=2,outline='red')
     
    ccarré1 = [(165, 165), (185, 165), (185, 185), (165, 185)]
    carré1 = can1.create_polygon(ccarré1,tags='disque1')
     
    ctrait1 = [(165,165), (200,200)]
    trait1 = can1.create_line(ctrait1,width=2,fill='blue', tags='disque1') # Coordonnées : (x1,y1,x2,y2)
     
    ctriangle1 = [(200, 225), (225, 200), (250, 225)]
    triangle1 =can1.create_polygon(ctriangle1, fill = 'green', tags='disque1')
     
     
    ccarré2 = [(135, 135), (155, 135), (155, 155), (135, 155)]
    carré2 = can1.create_polygon(ccarré2,tags='disque2')
     
    ctrait2 = [(135,135), (165,165)]
    trait2 = can1.create_line(ctrait2,width=2,fill='blue', tags='disque2')
     
    ctriangle2 = [(125, 150), (150, 125), (175, 150)]
    triangle2 =can1.create_polygon(ctriangle2, fill = 'green', tags='disque2')
     
    ccarré3 = [(265, 265), (285, 265), (285, 285), (265, 285)]
    carré3 = can1.create_polygon(ccarré3,tags='disque3')
     
    ctrait3 = [(265,265), (300,300)]
    trait3 = can1.create_line(ctrait3,width=2,fill='blue', tags='disque3') 
     
    ctriangle3 = [(270, 295), (295, 270), (320, 295)]
    triangle3 =can1.create_polygon(ctriangle3, fill = 'green', tags='disque3')
     
    can1.bind("<Button-1>", trouver_angle) #click gauche
    can1.bind("<B1-Motion>", mouvement) #Mouvement de la souris avec click gauche
     
    Button(fen1,text='Quitter',command=fen1.destroy, relief=RAISED, cursor ="pirate").pack(side=BOTTOM)
     
    # démarrage du réceptionnaire d'évènements (boucle principale) :
    fen1.mainloop()

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 426
    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 426
    Points : 37 008
    Points
    37 008
    Par défaut
    Citation Envoyé par Tony_35 Voir le message
    Avec les tags, je ne voit pas comment récupérer les objets ET leurs coordonnées dont j'ai besoin.
    Votre algo. calcule la rotation a effectuer entre l'objet dans sa position initiale et un angle donné par le déplacement. Comme vous avez toujours besoin des coordonnées initiales, à quoi vous servirait de récupérer les coordonnées à l'instant t?

    - W

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Votre algo. calcule la rotation a effectuer entre l'objet dans sa position initiale et un angle donné par le déplacement. Comme vous avez toujours besoin des coordonnées initiales, à quoi vous servirait de récupérer les coordonnées à l'instant t?

    - W
    Ils pourraient servir pour savoir sur quel disque on est ?
    Car lorsque l'on passe d'un disque à l'autre, les rotations ne sont pas les mêmes.

    EDIT : Voilà ce que je souhaite faire :

    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
    if (dx,dy) est dans disque 1 :
        for (obj,coord) in disque1:
            tournerdisque1(obj, coord);
        for (obj,coord) in disque2:
            tournerdisque2(obj, coord)
        for (obj,coord) in disque3:
            tournerdisque3(obj, coord)
     elif disque 1 < (dx,dy) < disque 2 :
          for (obj,coord) in disque2:
            tournerdisque2(obj, coord)
        for (obj,coord) in disque3:
            tournerdisque3(obj, coord)
     elif disque 2 < (dx,dy) < disque 3 :
        for (obj,coord) in disque3:
            tournerdisque3(obj, coord)
    Possible à partir de cette fonction ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def trouver_angle(event):
        global dx, dy
        dx = can1.canvasx(event.x) - center[0]
        dy = can1.canvasy(event.y) - center[1]

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

    Puisque trouver angle calcule le nombre complexe, sa "norme" pourrait être utilisée pour savoir dans quel(s) disque(s), non?
    note: lorsque vous programmez, il ne faut pas oublier son cours de maths.

    - W

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Puisque trouver angle calcule le nombre complexe, sa "norme" pourrait être utilisée pour savoir dans quel(s) disque(s), non?
    note: lorsque vous programmez, il ne faut pas oublier son cours de maths.

    - W
    Effectivement ! Merci pour la proposition


    EDIT : Donc ça ferait quelque chose d'à peu près comme cela, sauf que ça bug pas mal :/


    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
    def mouvement(event):
        # Calcul de l'angle actuel par rapport à l'angle initial
        global angle
        dx = event.x - center[0] #Distance entre x et le centre
        dy = event.y - center[1]
        angle = complex(dx, dy)/ abs(complex(dx, dy)) #on a e^i0
        module= sqrt(abs(dx+dy))
        if module < sqrt(20):
            for (obj,coord) in disque1:
                tournerdisquesens1(obj, coord);
            for (obj,coord) in disque2:
                 tournerdisquesens2(obj, coord)
            for (obj,coord) in disque3:
                 tournerdisquesens1(obj, coord)
        elif sqrt(20) < module < sqrt(30):
            for (obj,coord) in disque2:
                 tournerdisquesens2(obj, coord)
            for (obj,coord) in disque3:
                 tournerdisquesens1(obj, coord)
        elif sqrt(30) < module < sqrt(50):
            for (obj,coord) in disque3:
                 tournerdisquesens1(obj, coord)
     
    def tournerdisquesens1 (objet, coord):
        global angle
        zc = complex(center[0], center[1])
        newxy = []
        for x, y in coord: #Dans les coordonnées du polygone
            z = complex(x,y)
            v = angle*(z-zc) + zc #z=e^i0*(z - zc) + zc
            newxy.append(v.real)#.append : Ajoute une valeur à la fin de la liste newxy
            newxy.append(v.imag) 
        can1.coords(objet, *newxy) #Change les coordonnées, *: unpack
        #return [(newxy[i], newxy[i+1]) for i in range(0,8,2)]
     
    def tournerdisquesens2 (objet, coord):
        global angle
        décalage = complex(center[0], center[1])
        newxy = []
        for x, y in coord: 
            v = 1/angle * (complex(x, y) - décalage) + décalage
            newxy.append(v.real) 
            newxy.append(v.imag)
        can1.coords(objet, *newxy)

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

    Je pensais à quelque chose de plus simple comme:
    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
    # -*- coding:utf-8 -*-
    import tkinter as tk
    from tkinter.constants import *
     
    import math
     
    SIZE = 50
    COUNT = 3
     
    def on_button_press(event):
        canvas = event.widget
        x, y = canvas.canvasx(event.x), canvas.canvasy(event.y)
        print('on_button_press', x, y)
        c = complex(x, y)
        ix = int(abs(c) // SIZE)
        if ix < COUNT:
            print('cercle: ', ix)
     
    if __name__ == '__main__':
     
        root = tk.Tk()
        root.title('Jeu')
     
        length = 400
        middle = length // 2
        # on place le centre en 0, 0
        canvas = tk.Canvas(root, width=length, height=length,
              scrollregion=(-middle, -middle, middle, middle))
        canvas.pack(side=BOTTOM)
     
        for r in range(COUNT*SIZE, 0, -SIZE):
            iid = canvas.create_oval(-r, -r, r, r, fill='white', activeoutline='red', activewidth=3)
     
     
        canvas.bind("<ButtonPress-1>", on_button_press)
     
        tk.mainloop()
    - W

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Je pensais à quelque chose de plus simple comme:
    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
    # -*- coding:utf-8 -*-
    import tkinter as tk
    from tkinter.constants import *
     
    import math
     
    SIZE = 50
    COUNT = 3
     
    def on_button_press(event):
        canvas = event.widget
        x, y = canvas.canvasx(event.x), canvas.canvasy(event.y)
        print('on_button_press', x, y)
        c = complex(x, y)
        ix = int(abs(c) // SIZE)
        if ix < COUNT:
            print('cercle: ', ix)
     
    if __name__ == '__main__':
     
        root = tk.Tk()
        root.title('Jeu')
     
        length = 400
        middle = length // 2
        # on place le centre en 0, 0
        canvas = tk.Canvas(root, width=length, height=length,
              scrollregion=(-middle, -middle, middle, middle))
        canvas.pack(side=BOTTOM)
     
        for r in range(COUNT*SIZE, 0, -SIZE):
            iid = canvas.create_oval(-r, -r, r, r, fill='white', activeoutline='red', activewidth=3)
     
     
        canvas.bind("<ButtonPress-1>", on_button_press)
     
        tk.mainloop()
    - W

    Je n'ai jamais codé dans ce sens là donc je ne comprends pas trop ton code :/

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bon alors enfait j'avais oublié de mettre au carré...
    Donc ça marche très bien sauf que les coordonnées ne sont pas cohérentes, c'est à dire que le changement de rotation ne se fait pas exactement lorsque l'on est sur le cercle.

    Mes cercles étant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cercle1 = can1.create_oval(150,150,250,250,width=2,outline='yellow',activeoutline='white', activewidth=3)
    cercle2 = can1.create_oval(100,100,300,300,width=2,outline='red',activeoutline='white', activewidth=3)
    cercle3 = can1.create_oval(50,50,350,350,width=2,outline='blue',activeoutline='white', activewidth=3)
    Pour le premier on a :
    x-r=150
    x+r=250 => 2r = 100 => r=50 => de même pour y donc module = sqrt(2*50**2)
    De même pour le 2ème cercle : r=100
    Et pour le 3ème : r=150

    Voilà mon code :
    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
    def mouvement(event):
        # Calcul de l'angle actuel par rapport à l'angle initial
        global angle
        dx = can1.canvasx(event.x) - center[0] #Distance entre x et le centre
        dy = can1.canvasy(event.y) - center[1]
        angle = complex(dx, dy)/ abs(complex(dx, dy)) #on a e^i0
        module= sqrt(dx**2+dy**2)
        if module < sqrt(2*50**2):
            for (obj,coord) in disque1:
                tournerdisquesens1(obj, coord);
            for (obj,coord) in disque2:
                 tournerdisquesens2(obj, coord)
            for (obj,coord) in disque3:
                 tournerdisquesens1(obj, coord)
        elif module < sqrt(2*100**2):
            for (obj,coord) in disque2:
                 tournerdisquesens1(obj, coord)
            for (obj,coord) in disque3:
                 tournerdisquesens2(obj, coord)
        elif  module < sqrt(2*150**2):
            for (obj,coord) in disque3:
                 tournerdisquesens1(obj, coord)

Discussions similaires

  1. mouse.cursorpos.y différent de ce que j'attends
    Par Guigui_ dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/11/2002, 22h52
  2. algo : rotation d'objet 3d
    Par numeror dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 19/08/2002, 23h58
  3. Récupérer 10 nb différents avec un calcul aléatoire
    Par BXDSPORT dans le forum Langage
    Réponses: 3
    Dernier message: 04/08/2002, 03h35
  4. Simulation de transmission de paquet entre différent réseaux
    Par MelloW dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 20h51
  5. Réponses: 2
    Dernier message: 17/05/2002, 21h37

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