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 :

problème avec Canvas/math [Python 3.X]


Sujet :

Tkinter Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : juillet 2016
    Messages : 69
    Points : 28
    Points
    28
    Par défaut problème avec Canvas/math
    Bonjour,
    je voudrais obtenir le résultat suivantNom : cap2.png
Affichages : 67
Taille : 8,2 Ko,
    mais j'obtiens en fait Nom : cap1.png
Affichages : 68
Taille : 8,3 Ko
    avec le programme ci-dessous :
    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
    #! python3
    # coding: utf-8
     
    '''
    https://apcpedagogie.com/dessiner-avec-un-canvas-tkinter/#create_oval
    '''
     
    ##----- Importation des Modules -----##
    import os.path, sys
    from tkinter import *
    import tkinter as tk 
    import tkinter.font as tkFont
    from tkinter import filedialog
    import math
     
    ##----- Variables globales -----##
    LARGEUR = 300
    HAUTEUR = 300
    PI = 3.1416
    A = (50, 50)      # point haut-gauche du carré
    B = (250, 250)    # point bas-droite du carré
    R = int((B[0]-A[0]) / 2)                              # rayon
    C = (int((A[0] + B[0]) / 2), int((A[1] + B[1]) / 2))  # centre du cercle
    couleur  = [[120, 'light blue'],[130, 'orange'], [140, 'white'],
                [150, 'grey'], [160, 'yellow'],
                [170, 'white'], [180, 'light blue'], [190, 'white'], [1000, 'green']]   
     
    ##----- Définition des Fonctions -----##
    def test():
        inc_v = (B[1] - A[1]) / 20   # incrément vertical pour 10° 
        deb = 0
        fin = 10
        for i in range(10):
            dessin.create_arc(A, B, outline="red", extent=fin, start=deb, fill=couleur[i%len(couleur)][1], width=1)
            hauteur = round(R * math.tan(PI * 10 * i / 360))
            hor = int(R * math.cos(PI * 10 * i /360))
            v = C[1] - hauteur 
            h = C[0] + hor + 5
            dessin.create_text(h, v, text=str(fin), anchor='w',  fill='black')    # texte externe
            deb = fin
            fin += 10
     
     
    ##----- Création de la fenêtre -----##
    fen = Tk()
    fen.title('camembert')
     
    ##----- Création des boutons -----##
     
    ##----- Création du canevas -----##
    dessin=Canvas(fen, bg="ivory", width=LARGEUR, height=HAUTEUR)
    dessin.grid(row = 1, column = 0, columnspan = 2, padx=5, pady=5)
     
    ##----- Objets graphiques -----##
    dessin.create_oval(A, B,outline="light blue", width=3)
     
    ##----- Programme principal -----##
    test()
    fen.mainloop()# Boucle d'attente des événements
    Je ne vois pas où se trouve l'erreur.
    Merci pour votre aide

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 678
    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 : 18 678
    Points : 32 249
    Points
    32 249
    Par défaut
    Salut,

    Je calculerais les coordonnées des extrémités de l'arc.

    2 points définissent un carré et 4 coins: un est à l'intérieur du cercle, 2 sur le cercle et le dernier à l'extérieur.

    Les coins intérieurs et extérieurs devraient définir une droite qui passe par le centre du cercle et perpendiculaire à l'arc.

    Une première approximation pourrait être de placer le texte/label/étiquette sur le point du carré extérieur au cercle.

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

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : juillet 2016
    Messages : 69
    Points : 28
    Points
    28
    Par défaut
    Merci pour la suggestion,
    je vais creuser dans cette direction,
    mais la tangente et le cosinus devraient me donner des valeurs à peu près correctes pour le positionnement,
    sauf si je fais une grossière erreur...
    Bonne soirée

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 678
    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 : 18 678
    Points : 32 249
    Points
    32 249
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    mais la tangente et le cosinus devraient me donner des valeurs à peu près correctes pour le positionnement
    Les coordonnées d'un point sur le cercle en fonction d'un angle α sont O + (R*cos(α), R*sin(α)) et non O + (R*cos(α), R*tg(α) = R*(sin(α)/cos(α)).

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

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : juillet 2016
    Messages : 69
    Points : 28
    Points
    28
    Par défaut
    merci pour ce retour,
    je ne cherchais pas un point sur le cercle,
    mais un point sur la droite de l'arc.
    Nous sommes d'accord semble-t-il sur l'abscisse.
    Pour l'ordonnée (via la "hauteur" dans mon programme), il me semble que la tangente donne bien une ordonnée externe au cercle, un peu supérieure à l'ordonnée du point associé sur le cercle. Or le résultat donne plutôt des points trop bas, dès les angles de 30, 40. Dans la figure ci-contreNom : cap3.png
Affichages : 35
Taille : 8,2 Ko
    j'ai affiché les angles précédents en jaune, calculés via la tangente, et des astérisques en noir positionnées via le sinus. Pas de différence manifeste.
    La séquence de code est :
    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
    def test():
        inc_v = (B[1] - A[1]) / 20   # incrément vertical pour 10° 
        deb = 0
        fin = 10
        for i in range(10):
            dessin.create_arc(A, B, outline="red", extent=fin, start=deb, fill=couleur[i%len(couleur)][1], width=1)
            hauteur = round(R * math.tan(PI * 10 * (i+1) / 360))
            hor = round(R * math.cos(PI * 10 * (i+1) /360))
            v = C[1] - hauteur 
            h = C[0] + hor + 5
            h1 = C[0] + round(R * math.cos(PI * 10 * (i+1) /360)) + 5
            dessin.create_text(h, v, text=str(fin), anchor='w',  fill='yellow')    # texte externe
            dessin.create_text(h1, v, text="*", anchor='w',  fill='black')    # texte externe
            deb = fin
            fin += 10
    Bon après-midi

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 678
    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 : 18 678
    Points : 32 249
    Points
    32 249
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    je ne cherchais pas un point sur le cercle
    Je ne comprends pas le code que vous avez écrit.
    Normalement, on détaille l'algo. avant de le coder
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : juillet 2016
    Messages : 69
    Points : 28
    Points
    28
    Par défaut
    dommage

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 678
    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 : 18 678
    Points : 32 249
    Points
    32 249
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    dommage
    La circonférence d'un cercle de rayon R=1 est égale à 2*PI.

    => diviser l'angle en degrés par 360 pour le multiplier par PI ensuite, pourquoi pas mais c'est pas cohérent avec ce que vous voulez.

    => Ce que donne la tangente est décrit sur Wikipédia avec de jolis graphiques. Lorsqu'on va vers 90° le cosinus tend vers 0, et la tangente part à l'infini (impossible qu'elle soit pas trop loin du cercle).

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

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : juillet 2016
    Messages : 69
    Points : 28
    Points
    28
    Par défaut
    merci pour ces précisions,
    je dessine des secteurs de 10° et j'affiche successivement 10, 20, 30, etc.
    Je calcule la hauteur via la tangente et, avec Python, je suis tenu à exprimer l'angle en radian, d'où PI.
    Les positionnements obtenus correspondent grossièrement à mon objectif,
    mais c'est le "grossièrement" qui me perturbe.
    Pour la hauteur je prends le rayon par la tangente.
    Pour l'abscisse je prends le cosinus.

    Mon problème : où*fais-je une erreur pour ne pas avoir de meilleurs positionnements ?

    Cordialement

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 678
    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 : 18 678
    Points : 32 249
    Points
    32 249
    Par défaut
    Citation Envoyé par jam7575 Voir le message
    Mon problème : où*fais-je une erreur pour ne pas avoir de meilleurs positionnements ?
    Depuis 2 jours j'essaie de vous expliquer qu'il faudrait peut être revoir quelques notions de géométrie... après c'est vous qui voyez mais les erreurs sont là.

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

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : juillet 2016
    Messages : 69
    Points : 28
    Points
    28
    Par défaut
    d'accord.
    Ceci dit, en voulant utiliser le sinus, je me suis un peu mélangé les pinceaux entre ordonnée et abscisse dans la programmation.
    J'ai corrigé.
    Maintenant, vos remarques obstinées m'ont conduit à revoir la correspondance entre radian et degré. En fait un tour de cercle fait 2 PI radians et non 1 PI radian comme je croyais m'en souvenir (des dizaines d'années...). C'est là qu'était la grossière erreur ! Et avec cette correspondance entre radians et degrés, la tangente ne
    correspond plus à mon besoin effectivement.
    Merci

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    juin 2008
    Messages
    18 678
    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 : 18 678
    Points : 32 249
    Points
    32 249
    Par défaut
    Salut,

    La tangente est la pente de la droite définie par un rayon d'angle α.
    Si le cercle passe par l'origine çà donnera y = tan(α) * x.
    Pour un point du cercle de rayon d'angle α, on remplace x par R * cos(α).
    Et comme tg(α) = sin(α)/cos(α)... pour éviter la division par 0, autant utiliser sin(α) directement.

    Et si on ne se trompe pas dans la géométrie, faire des camemberts avec le Canvas tkinter est facile:
    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
    import tkinter as tk
    import math
     
    SIZE = 400
    N = 10
    R = 100
    COLORS = 'yellow', 'grey'
     
    u = SIZE // 2
    canvas = tk.Canvas(width=SIZE, height=SIZE, scrollregion=(-u, -u, u, u))
    canvas.pack()
    canvas.create_oval (-R, -R, R, R, outline='red', width=3)
     
    angle = 360//N
    for i in range(N):
        u = i*angle
        canvas.create_arc(-R, -R, R, R, extent=angle, start=u, fill=COLORS[i%len(COLORS)])
        v = math.radians(u)
        x, y = R * math.cos(v), R * math.sin(v)
        canvas.create_text(x * 1.15, -y * 1.15, text=u)
     
    tk.mainloop()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    juillet 2016
    Messages
    69
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : juillet 2016
    Messages : 69
    Points : 28
    Points
    28
    Par défaut
    merci encore,
    mais mon déraillement initial avec PI au lieur de 2 PI m'a fait perdre les pédales.
    Le sinus convient tout à fait en effet, mais au départ je voulais utiliser la tangente qui donne la hauteur au niveau de l'extrémité droite du rayon.
    Sinon, pas de problème, j'ai fait (il y a*60 ans) math sup et math spé, et je comprends fort bien la trigonométrie, malgré sans doute un gâtisme débutant.
    Désolé de vous avoir ainsi 'perturbé' avec cette histoire de PI non doublé, plus cette histoire de tangente qui ne correspondait pas à ce que je disais vouloir faire.
    Si vous avez compris mes errements, bravo...
    Pour le contexte, j'ai créé un programme pour tracer mes relevés de tension un peu dans tous les sens et je voulais ajouter une vue façon camembert. Maintenant c'est (presque) bon.
    Merci encore et bonne nuit

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

Discussions similaires

  1. Problème avec Canvas
    Par sfpx dans le forum Composants graphiques
    Réponses: 3
    Dernier message: 12/10/2011, 15h51
  2. Problème avec Canvas TextOut
    Par dadouuuu dans le forum Débuter
    Réponses: 4
    Dernier message: 22/12/2010, 11h08
  3. problème avec canvas
    Par nouvelesprit dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 23/04/2010, 20h45
  4. Problème avec Canvas.ActualHeight
    Par Manhuman dans le forum Silverlight
    Réponses: 2
    Dernier message: 29/05/2009, 10h07
  5. Problème avec Canvas et drawImage
    Par marmarnas dans le forum AWT/Swing
    Réponses: 5
    Dernier message: 01/04/2008, 12h26

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