Forum EduPython

Echanges autour d'EduPython.

Vous n'êtes pas identifié(e).

#1 2019-03-30 18:25:01

papaLya
Membre
Lieu : Niger
Inscription : 2018-12-21
Messages : 3
Site Web

Module turtle Fractales: vonKoch, antiflocon de vonKoch

Bonjour à tous,

j'ai utilisé le module turtle pour introduire la programmation fonctionnelle en seconde,

c'est plutôt pris de façon ludique par les élèves, ça change des défis France IOI et Algoréa sur lesquels on travaille d'habitude.

La programmation récursive n'est pas au programme de seconde, de plus la fonction vonKoch qui produit récursivement le tracé de la courbe de VonKoch de niveau n est un mauvais exemple d'introduction à la récursivité car l'algorithme n'est pas facile à concevoir ni à comprendre. L'objectif est de faire utiliser la fonction vonKoch pour tracer le flocon de Von Koch ou l'antiflocon de Von Koch, faire des animations modestes avec le module turtle.

Le sujet des fractales étant vaste, je propose de lancer un espace d'échange sur la programmation fonctionnelles avec turtle.

################################################################
Programme ''animation'' antiflocon de Von Koch du niveau 0 au niveau 7

from turtle import *
from sys import setrecursionlimit
setrecursionlimit(10**8) # réglage de la limite de récursion (nb appels de fonctions limité à 1000 en python)
from time import sleep # permet de suspendre momentanément l'exécution du programme

# fonction principale main -> rend python plus performant et permet
# l'utilisation de l'instruction ''nonlocal'' ligne 11, etc..
def main():

    def vonKoch(niveau): # fonction récursive, fonction qui s'appelle elle même
        nonlocal taille # accès à la variable taille...voir portée de variable pour les curieux
        if niveau == 0:
           forward(taille)
        else:
           vonKoch(niveau-1) # la fonction s'appelle elle même
           left(60)
           vonKoch(niveau-1)  # la fonction s'appelle elle même
           right(120)
           vonKoch(niveau-1)  # la fonction s'appelle elle même
           left(60)
           vonKoch(niveau-1)  # la fonction s'appelle elle même


    def brancheAntiflocon(niveau):
        nonlocal taille
        begin_fill()
        vonKoch(niveau)
        right(180)
        vonKoch(niveau)
        end_fill()

    #  la méthode sur les string format(niveau) permet d'insérer la valeur de niveau
    #  dans la chaine de caractères au niveau de la balise {}

    def antiflocon(niveau):
        nonlocal taille
        up()
        clear()
        angle=90
        for _ in range(3):
            up()
            goto(0,-75)
            setheading(angle)
            angle+=120
            down()
            brancheAntiflocon(niveau)
            title("Antiflocon de VonKoch de niveau {}".format(niveau))
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # Paramétrages

    bgcolor("orange")  # back ground color: couleur d'arrière plan
    color('white', 'green')  # color(penColor,fillColor)
    hideturtle()
    pensize(0)
    speed(0)

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    # tracé des antiflocons du niveau 0 à 7

    for niveau in range(8):  # niveau prend toutes les valeurs de 0 à 7
        taille = 333 / (3**niveau)
        tracer(False)
        antiflocon(niveau)
        tracer(True)
        sleep(7) # met en veille le programme pendant 7 seconde
    mainloop()

main()
# Remarque: les fonctions récursives ne sont pas au programme de seconde
# la fonction VonKoch est une fonction difficile à comprendre pour un débutant
# en programmation mais c'est un exemple classique de fractale mathématique


################################################################
Programme ''animation" courbe de Von Koch niveau 1 à 7

from turtle import *
from sys import setrecursionlimit
setrecursionlimit(10**8)
from time import time, sleep

def main():

    def vonKoch(niveau):
        nonlocal taille
        if niveau==0:
           forward(taille)
        else:
           vonKoch(niveau-1)
           left(60)
           vonKoch(niveau-1)
           right(120)
           vonKoch(niveau-1)
           left(60)
           vonKoch(niveau-1)


    bgcolor("black")
    color('#0000ff', '#55ffff')  # color(penColor,fillColor)
    hideturtle()
    pensize(0)

    for niveau in range(8):
        up()
        goto(-500,-200)
        clear()
        down()
        taille=999/(3**niveau)
        tracer(False) # pour obtenir directement le résultat
        begin_fill()
        vonKoch(niveau)
        end_fill()
        title("Branche de VonKoch de niveau {}".format(niveau))
        tracer(True) # remarque: si on met un seul tracer(False) avant la boucle ça plante ...
        sleep(7) # met en veille le programme pendant 7 seconde
    mainloop()

main()

Hors ligne

Pied de page des forums