Turtle Python

Résolu
Smoodie - 4 mars 2023 à 16:17
yg_be Messages postés 22486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 février 2024 - 5 mars 2023 à 20:56

Bonjour,

j'ai un petit probleme au niveau de mon code, je cherche a faire un outil qui convertie les pourcentages en graphique sur turtle (graphique circulaire) mais le probleme est que des fois un traits se superpose sur les segments de couleurs (exemple si dessus)

Le probleme vient surement de la façon dont est dessiné le cercle mais je ne sais pas comment fix l'erreur 
 

Voila mon code (pas tout le code mais la fonction) :

def draw_circle_parts(angles, colors, radius, max_arc_length=50):
    t = turtle.Turtle()
    t.speed("fastest")
    t.penup()
    t.goto(0, -radius)
    t.pendown()

    total_angle = sum(angles)
    for i, angle in enumerate(angles):
        t.fillcolor(colors[i])
        t.begin_fill()
        t.goto(0, 0)
        t.setheading(90)
        start_angle = sum(angles[:i])
        end_angle = start_angle + angle
        arc_length = radius * math.pi * angle / 180
        for j in range(int(start_angle), int(end_angle)):
            t.goto(radius * math.cos(j * math.pi / 180), radius * math.sin(j * math.pi / 180))
        t.goto(0, 0)
        t.end_fill()

        if arc_length > max_arc_length:
            t.penup()
            angle_percent = round(angle / total_angle * 100, 2)
            t.goto(radius * 0.8 * math.cos((start_angle + end_angle) / 2 * math.pi / 180),
                   radius * 0.8 * math.sin((start_angle + end_angle) / 2 * math.pi / 180))
            t.pendown()
            t.write(f'{angle_percent}%', align='center', font=('Arial', 8, 'normal'))
            t.penup()

    t.hideturtle()
    turtle.done()


Windows / Edge 110.0.1587.57

2 réponses

yg_be Messages postés 22486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 février 2024 1 446
Modifié le 4 mars 2023 à 20:16

bonjour,

ton code ne fait rien.  cela me semble normal, sans appel à la fonction.

0

j'ai preciser entre les parenthèse que ce n'est qu'un extrait de tout le code, c'est le code qui permet la generation du cercle, le calcul des pourcentages en degrees etc... se fait dans une autre fonction, le probleme que j'ai c'est seulement la ligne qui se superpose sur le premier segments de couleurs seulement (si par exemple le premier segment du cercle n'atteint pas la ligne, le deuxieme/troisieme/etc.. segment se superposera sur la ligne sans probleme
PS : quand je parle d'erreur je parle surtout du probleme en lui même

0
yg_be Messages postés 22486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 février 2024 1 446 > Smoodie
5 mars 2023 à 10:38

comment appelles-tu la fonction?

0
Smoodie > yg_be Messages postés 22486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 février 2024
Modifié le 5 mars 2023 à 13:16

je ne suis pas un debutant en python mais, en turtle oui, voila comment je l'appele :

def main():
    angles = []
    colors = []
    data = []
    total = 0
    graphic = input('[*] Choisissez un type de graphique :\n(1) Graphique Circulaire  |  (2) Graphique à barres\n')
    match graphic:
        case '1':
            while total != 100:
                data = float(input('[*] Entrez un pourcentage : '))
                if total + data > 100:
                    print('[!] Erreur: la somme des pourcentages dépasse 100...')
                else:
                    angles.append(data * 3.6)
                    total += data
                    colors.append(input('[*] Entrez une couleur pour la partie du cercle (en anglais) : '))
            print(angles)
            draw_circle_parts(angles, colors, 200)  # C'est ici que je l'appele
        case '2':
            while True:
                try:

                    n_bars = int(input("[*] Combien de barres voulez-vous dessiner? "))
                    break
                except ValueError:
                    print("[!] Erreur: Entrez un nombre entier!")

            for i in range(n_bars):
                while True:
                    try:
                        data.append(float(input(f"[*] Entrez la valeur pour la barre {i + 1}: ")))
                        colors.append(input(f"[*] Entrez la couleur pour la barre {i + 1} (en anglais): "))
                        break
                    except ValueError:
                        print("[!] Erreur: Entrez une valeur numérique!")

            draw_bar_graph(data, colors, 20, 0.5)  # Une autre fonction
        case _:
            input('Erreur: Choix invalid!')
            main()


if __name__ == '__main__':
    main()

Sinon le code marche très bien aucune erreur dans ma console, le vrai probleme est dans la façon dont le cercle/le premier segments (je ne sais pas pour le coup) est dessiner 

0
yg_be Messages postés 22486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 février 2024 1 446 > Smoodie
5 mars 2023 à 13:23

Peux-tu partager un code qui ne pose pas de question?

0
Smoodie > yg_be Messages postés 22486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 février 2024
Modifié le 5 mars 2023 à 13:44

pour t'expliquer en bref, le script est censé generer plusieurs type de graphique, le graphique a barre, et le graphique circulaire le "match graphic" est une nouvelle fonctionnalité python depuis la 3.10 qui remplace un peu les if graphic == '1':     elif graphic == '2'
puis si l'utilisateur a choisi 1 (ne prend pas en compte case '2' c'est pour le graphique a barre) on recupère le pourcentage puis en le convertie en degrees toute en l'ajoutant a la liste angles, puis en demande la couleurs qu'on veut du segment de cercle (par ex : '100', puis 'red', nous affichera 100% du cercle en rouge, comme l'exemple toute eeeeen haut), puis lorsqu'on arrive a 100 (sans la depasser) on arrete la boucle et on appele la fonction 'draw_circle_parts(angles, colors, 200)', j'espere que tu as un peu mieux compris mon code. 

0

Salut, le problème se situe dans ton range, ne pas oublier que la dernière valeur n'est pas incluse.

Donc:

for j in range(int(start_angle), int(end_angle) + 1):
    # code
0

merci tu viens de resoudre un des problemes que j'avais (le vide qu'il y'a entre les parties du cercles), pas celui que je demandais mais merci quand même!

EDIT : j'ai fixier le bug en enlever carrément le pendown 

    t = turtle.Turtle()
    t.speed("fastest")
    t.penup()
    t.goto(0, -radius)
0
yg_be Messages postés 22486 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 25 février 2024 1 446 > Smoodie
5 mars 2023 à 20:56

en effet, tu faisais une panade entre tes déplacements avec la plume abaissée et tes déplacements afin de remplir les zones de couleurs.

0