Flocon de Kochđź”—

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
#!/usr/bin/env python3
# coding: utf-8

from __future__ import division  # Pas de division euclidienne par défaut

"""
Tracé (via 'turtle') d'un flocon de Koch d'ordre arbitraire.

Dans le mĂŞme genre:

- courbe de Peano (http://fr.wikipedia.org/wiki/Courbe_de_Peano)
- courbe de Hilbert (http://fr.wikipedia.org/wiki/Courbe_de_Hilbert)
- île de Gosper (http://fr.wikipedia.org/wiki/Île_de_Gosper)

Voir Ă©galement:

- L-système: http://fr.wikipedia.org/wiki/L-système
- Autres exemples: http://natesoares.com/tutorials/python-fractals/
"""

import turtle as T

__version__ = "Time-stamp: <2013-01-14 00:49 ycopin@lyopc469>"
__author__ = "Yannick Copin <y.copin@ipnl.in2p3.fr>"


def koch(ordre=3, niveau=0, taille=100, delta=0):
    """
    Tracé du flocon de Koch d'ordre 'ordre', de taille 'taille'
    (px).

    Cette fonction récursive permet d'initialiser le flocon (niveau=0,
    par défaut), de tracer les branches fractales (0 < niveau <= ordre) ou
    bien juste de tracer un segment (niveau > ordre).
    """

    if niveau == 0:                         # Dessine le triangle de niveau 0
        T.title(f"Flocon de Koch - ordre {ordre}")
        koch(niveau=1, ordre=ordre, taille=taille, delta=delta)
        T.right(120)
        koch(niveau=1, ordre=ordre, taille=taille, delta=delta)
        T.right(120)
        koch(niveau=1, ordre=ordre, taille=taille, delta=delta)
    elif niveau <= ordre:                  # Trace une section _/\_ du flocon
        koch(niveau=niveau + 1, ordre=ordre, taille=taille, delta=delta)
        T.left(60 + delta)
        koch(niveau=niveau + 1, ordre=ordre, taille=taille, delta=delta)
        T.right(120 + 2 * delta)
        koch(niveau=niveau + 1, ordre=ordre, taille=taille, delta=delta)
        T.left(60 + delta)
        koch(niveau=niveau + 1, ordre=ordre, taille=taille, delta=delta)
    else:                               # Trace le segment de dernier niveau
        T.forward(taille / 3 ** (ordre + 1))

if __name__ == '__main__':

    # start-argparse
    # Exemple d'utilisation de la bibliothèque de gestion d'arguments 'argparse'
    import argparse

    desc = "Tracé (via 'turtle') d'un flocon de Koch d'ordre arbitraire."

    # DĂ©finition des options
    parser = argparse.ArgumentParser(description=desc)
    parser.add_argument('ordre', nargs='?', type=int,
                        help="Ordre du flocon, >0 [%(default)s]",
                        default=3)
    parser.add_argument('-t', '--taille', type=int,
                        help="Taille de la figure, >0 [%(default)s px]",
                        default=500)
    parser.add_argument('-d', '--delta', type=float,
                        help="Delta [%(default)s deg]",
                        default=0.)
    parser.add_argument('-f', '--figure', type=str,
                        help="Nom de la figure de sortie (format EPS)")
    parser.add_argument('-T', '--turbo',
                        action="store_true", default=False,
                        help="Mode Turbo")

    # DĂ©chiffrage des options et arguments
    args = parser.parse_args()

    # Quelques tests sur les args et options
    if not args.ordre > 0:
        parser.error(f"Ordre requis {args.ordre!r} invalide")

    if not args.taille > 0:
        parser.error("La taille de la figure doit ĂŞtre positive")
    # end-argparse

    if args.turbo:
        T.hideturtle()
        T.speed(0)

    # Tracé du flocon de Koch d'ordre 3
    koch(ordre=args.ordre, taille=args.taille, delta=args.delta)
    if args.figure:
        # Sauvegarde de l'image
        print(f"Sauvegarde de la figure dans {args.figure!r}")
        T.getscreen().getcanvas().postscript(file=args.figure)

    T.exitonclick()

Source: koch.py