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.
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
Et comment sont déterminés les centres des cercles construits autour du cercle de départ ?
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)
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.
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
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
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)
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.
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.
Fractales de cercles - Récursivité
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
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)
Découverte Python Doc Tkinter Les chaînes de caractères
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)
Découverte Python Doc Tkinter Les chaînes de caractères