Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fractales de cercles - Récursivité

    26 septembre 2021 à 10:43:41

    Bonjour,

    J'ai un exos à faire en NSI ou il faut faire des cercles de manière récursive en python.

    Je ne sais pas comment m'y prendre pour la partie de rappel de la fonction.

    Il faut que le programme puisse renvoyer cela : 

    Voici mon début de code :

    import turtle
    
    def cercle(x,y,r):    # Fonction pour tracer un cercle
        turtle.penup()    # Lève le crayon
        turtle.goto(x,y-r)# Déplacement du crayon aux coordonnées citées (x,y)
        turtle.pendown()  # Pose le crayon
        turtle.circle(r)  # Trace un cercle de rayon r px
        turtle.penup()    # Leve le crayon
        turtle.goto(x, y) # Va au centre du cercle
    
    def fractaleRec(x,y,r,nbEtapes): # Fonction récursive
        if nbEtapes == 0: # Condtion de sortie
            cercle(-128, 128, 128) # Grand cercle (comme dans etape 0)
        else : # Partie récursive
            fractaleRec()
            
    
    #_________________________________________________
    #
    # PROGRAMME PRINCIPAL
    #_________________________________________________
    
    turtle.setup(800, 600, 200, 200)    # Création d'une fenêtre de taille 800 pixels par 600 positionnée à 100 en x et 100 en y
    turtle.title("Fenetre Fractale")   # Change le titre de la fenêtre
    turtle.bgcolor("#9AC1BC")   # Met fond en vert
    turtle.speed(5)             # Vitesse de déplacement du crayon -> Fastest
    #turtle.hideturtle()         # Cache le crayon
    turtle.pensize(2)           # Largeur du trait
    turtle.pencolor("brown")    # Change la couleur de traçage en marron (possibilité d'utiliser l'hexadécimal)
    
    
    nbE = int(input("Combien d'etapes ? :"))
    fractaleRec(-128,128,128,nbE)
    
    turtle.exitonclick()    # Quitte la fenêtre si l'on clique sur la souris
    

    A chaque étape le rayon d'un cercle est divisé par deux par rapport au plus petit de l'étape précédente.

    Je vous remercie d'avance pour votre aide

    -
    Edité par Darius programmeur 26 septembre 2021 à 10:44:46

    • Partager sur Facebook
    • Partager sur Twitter
    VIVE LA PROGRAMMATION!!!
      26 septembre 2021 à 10:50:46

      Bonjour,

      Lors du rappel de la fonction fractaleRec() il faut au moins lui passer ses 4 arguments x,y,r,nbEtapes et qui auront changé puisque le cercle suivant est plus petit et à une position différente

      • Partager sur Facebook
      • Partager sur Twitter
        26 septembre 2021 à 10:50:49

        Et comment sont déterminés les centres des cercles construits autour du cercle de départ ?
        • Partager sur Facebook
        • Partager sur Twitter

        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

          26 septembre 2021 à 11:08:40

          Phil_1857 a écrit:

          Bonjour,

          Lors du rappel de la fonction fractaleRec() il faut au moins lui passer ses 4 arguments x,y,r,nbEtapes et qui auront changé puisque le cercle suivant est plus petit et à une position différente

          Oui je n'avais pas encore mis le paramètre car je ne savais pas comment les faire évoluer

          fred1599 a écrit:

          Et comment sont déterminés les centres des cercles construits autour du cercle de départ ?


          Si on prend le plus grand cercle, celui à côté sera d'ordonnée inchangée et d'abscisse x2 = x1 + x1 * 1.5, même principe pour celui qui sera en dessous, l'abscisse restera inchangée et l'ordonnée y2 = y1 - 1.5 * y1. J'ai donné les plus grande valeur avec des multiples de 2 pour que ca ne donne pas d'erreur du moins avec quelques étapes.

          Merci de vos réponses


          • Partager sur Facebook
          • Partager sur Twitter
          VIVE LA PROGRAMMATION!!!
            26 septembre 2021 à 12:48:13

            Je suppose qu'on vous a montré des exemple de dessins analogues, le cas typique étant le triangle de Sierpinski, si tu n'as jamais vu d'exemple, l'exercice n'est pas évident.

            Voici un code qui produit le dessin sous Matplotlib, je te laisse adapter à Turtle :

            import matplotlib.pyplot as plt
            
            def tracer(cercle):
                center, rad=cercle
                circ=plt.Circle(center, rad, lw=1, fill=False)
                plt.gca().add_patch(circ)
            
            # --------- Code du dessin  --------------------------
            
            def motif(cercle, n):
                if n>=0:
                    tracer(cercle)
                    (x, y), R=cercle
                    motif(((x+3/2*R, y), R/2), n-1)
                    motif(((x, y-3/2*R), R/2), n-1)        
            
            cercle0=((0,0), 10)
            motif(cercle0, n=4)
            
            # -------- FIN du code du dessin --------------------
            
            plt.axis('equal')
            plt.axis('off')
            plt.show()
            

            Pour dessiner avec Matplotlib, voir ICI par exemple.

            -
            Edité par PascalOrtiz 26 septembre 2021 à 14:21:52

            • Partager sur Facebook
            • Partager sur Twitter
              26 septembre 2021 à 14:30:44

              PascalOrtiz a écrit:

              Je suppose qu'on vous a montré des exemple de dessins analogues, le cas typique étant le triangle de Sierpinski, si tu n'as jamais vu d'exemple, l'exercice n'est pas évident.

              Voici un code qui produit le dessin sous Matplotlib, je te laisse adapter à Turtle :

              import matplotlib.pyplot as plt
              
              def tracer(cercle):
                  center, rad=cercle
                  circ=plt.Circle(center, rad, lw=1, fill=False)
                  plt.gca().add_patch(circ)
              
              # --------- Code du dessin  --------------------------
              
              def motif(cercle, n):
                  if n>=0:
                      tracer(cercle)
                      (x, y), R=cercle
                      motif(((x+3/2*R, y), R/2), n-1)
                      motif(((x, y-3/2*R), R/2), n-1)        
              
              cercle0=((0,0), 10)
              motif(cercle0, n=4)
              
              # -------- FIN du code du dessin --------------------
              
              plt.axis('equal')
              plt.axis('off')
              plt.show()
              

              Pour dessiner avec Matplotlib, voir ICI par exemple.

              -
              Edité par PascalOrtiz il y a 5 minutes

              Oui donc le PO n'a pas donné les bonnes équations ou j'ai pas bien compris ton code ?

              -
              Edité par fred1599 26 septembre 2021 à 14:32:37

              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                26 septembre 2021 à 14:43:04

                fred1599 a écrit:

                Oui donc le PO n'a pas donné les bonnes équations ou j'ai pas bien compris ton code ?

                Sa réponse à ta question n'est pas très claire mais l'examen des dessins donnés en exemple montre qu'à chaque nouvelle génération de cercles, ces derniers ont un rayon qui est la moitié de ceux de la génération précédente. De toute façon, cette question est un détail d'implémentation, tu vois bien que les nouveaux cercles sont tangents extérieurement au Sud et à l'Est et que leur position est donc uniquement déterminée par le rapport des rayons.
                • Partager sur Facebook
                • Partager sur Twitter
                  27 septembre 2021 à 13:26:30

                  sinon 1ère erreur de taille dans le code du PO, il n'utilise pas les paramètres de sa fonction pour tracer le cercle quand nbEtapes=0, ce qui voudrait dire que dans la dernière étape, on tracerai toujours le même cercle, quelque soit les paramètres passées à la fonction.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Fractales de cercles - Récursivité

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  • Editeur
                  • Markdown