#!/usr/bin/env python
# -*- coding: latin-1 -*-
# (c) Olivier Pirson ------ DragonSoft
# http://www.opimedia.be/DS/

from turtle import *

def flock(len=100, ite=4):
    """Trace (à partir de la position courante) un flocon de von Koch"""
    for i in range(0, 3):
        flock_side(len=len, ite=ite)
        right(120)

def flock_side(len=100, ite=4):
    """Trace (à partir de la position courante) un côté d'un flocon de von Koch"""
    if ite > 0:
        flock_side(len=len/3.0, ite=ite - 1)
        left(60)
        flock_side(len=len/3.0, ite=ite - 1)
        right(120)
        flock_side(len=len/3.0, ite=ite - 1)
        left(60)
        flock_side(len=len/3.0, ite=ite - 1)
    else:
        forward(len)

def histo(l, w=10):
    """Trace (à partir de la position courante) un histogramme de largeur w
    avec les éléments de la séquence l"""
    if len(l) > 0:
        left(90)
        forward(l[0])
        right(90)
        forward(w)
        right(90)
        forward(l[0])
        left(90)
        histo(l[1:], w=w)

def poly(c, len=50, nb=None, anti=False):
    """Trace dans le sens horloger (à partir de la position courante)
    nb côtés d'un polygône régulier à c côtés.
    Si nb == None alors trace les c côtés
    Si anti alors trace dans le sens anti-horloger"""
    if nb == None:
        nb = c
    if nb > 0:
        forward(len)
        if anti:
            left(360.0/c)
        else:
            right(360.0/c)
        poly(c, len=len, nb=nb - 1, anti=anti)

def to(x, y):
    """Se déplace sans tracer à la position (x, y) et fixe l'orientation à 0"""
    up()
    goto(x, y)
    setheading(0)
    down()


#tracer(False)  # pour désactiver le mode tortue au ralenti
delay(1)  # rapidité de la tortue (en ms)

to(-200, 0)
poly(3)

to(-140, 0)
begin_fill()
poly(3, len=30, anti=True)
end_fill()

to(-100, 0)
poly(12, len=30, nb=10)

to(-20, 0)
right(90)
histo([10, 40, 20, 30, 50], w=20)

to(0, 0)
histo([10, 40, 20, 30, 50])

to(70, 0)
flock()

done()  # pour garder la fenêtre ouverte
