Formation I.S.N.

Gosper

une courbe de Gosper

Proposer une tortue python récursive réalisant :

  • Avec n = 0 :
     gosper 0
  • Avec n = 1 :
     gosper 1
  • Avec n = 2 :
     gosper 2
  • Avec n = 3 :
     gosper 3
  • Avec n = 4 :
     gosper 4
  • documentation
  • un code

On trouvera la doc sur le module turtle ici.


import turtle as tl
from random import randint
 
def majfenetre(f):
	"""fonction decorateur, sert principalement à mettre la fenêtre à jour
	pour éviter que le dessin ne sorte de la figure."""
	bgx, bgy = 0, 0
	hdx, hdy = 0, 0
	 
	def g(cote, profondeur,  direction, angle):
		nonlocal bgx, bgy, hdx, hdy
		f(cote, profondeur,  direction, angle)
		x, y = tl.position()
		bgx, bgy = min(bgx, x), min(bgy, y)
		hdx, hdy = max(hdx, x), max(hdy, y)
		tl.setworldcoordinates(bgx,bgy,hdx,hdy)
		# on cache la tortue :	
		tl.hideturtle()
		# on choisit au hasard la couleur :
		tl.pencolor((randint(0,255),randint(0,255), randint(0,255)))
		# épaisseur du trait  :
		tl.pensize(2)
		# vitesse tortue :
		tl.speed(0)
	return g 
	

def gosper(cote, profondeur,  direction, angle) :
	if (profondeur == 0) : tl.forward(cote)
	else :
		cote /= 2 
		profondeur -= 1
		if(direction ==  -1) :
			gosper(cote,profondeur, -1, angle)
			tl.left(angle)
			gosper(cote,profondeur, 1, angle)
			tl.left(2*angle)
			gosper(cote,profondeur, 1, angle)
			tl.right(angle)
			gosper(cote,profondeur, -1, angle)
			tl.right(2*angle)
			gosper(cote,profondeur, -1, angle)
			gosper(cote,profondeur, -1, angle)
			tl.right(angle)
			gosper(cote,profondeur, 1, angle)
			tl.left(angle)
		else :
			tl.right(angle)
			gosper(cote, profondeur, -1, angle)
			tl.left(angle)
			gosper(cote, profondeur, 1, angle)
			gosper(cote, profondeur, 1, angle)
			tl.left(2*angle)
			gosper(cote, profondeur, 1, angle)
			tl.left(angle)
			gosper(cote, profondeur, -1, angle)
			tl.right(2*angle)
			gosper(cote, profondeur, -1, angle)
			tl.right(angle)
			gosper(cote, profondeur, 1, angle)
		
# titre de la fenêtre graphique : 
tl.title("Courbe de Gosper")		
# dimensions de la fenêtre graphique et position dans l'écran :
tl.setup (width=600, height=600, startx=0, starty=0) 
# orientation intiale de la tête : vers la droite de l'écran :
tl.setheading(0)  
# pour coder les couleurs en rgb :
tl.colormode(255)
# décorateur pour mise à jour du repère de la fenêtre
# permet de recentrer le graphique dans la fenêtre lorsqu'il en sort :
gosper = majfenetre(gosper)
# on lance gosper :
gosper(cote = 200, profondeur = 3,  direction = 1, angle = 60) 
# fermeture par clic dans la fenêtre : 
tl.exitonclick()