Coordonnées

Département d'informatique
Université du Québec à Montréal
CP 8888, Succ. Centre-ville
Montréal (Québec) H3C 3P8
Tél: 514-987-3000, #5516
Bureau: PK-4525
Courriel: blondin_masse[point]alexandre
[arobase]uqam[point]ca

À propos

J'ai complété mon doctorat en mathématiques-informatique sous la supervision des professeurs Srecko Brlek, de l'Université du Québec à Montréal, au Canada, et de Laurent Vuillon, de l'Université de Savoie, en France.

Depuis le 1er août 2014, je suis professeur adjoint à l'Université du Québec à Montréal, au Canada.

Liens utiles

Récursivité et fractales

[english]

Le 2012-02-29 par Alexandre Blondin Massé

Selon moi, une façon intéressante d'enseigner les algorithmes récursifs est de montrer qu'il est possible de générer de beaux dessins à l'aide d'algorithmes récursifs très simples.

Dans ce but, le module Python turtle est particulièrement bien adapté. Lorsque j'avais huit ans, je me rappelle avoir découvert la puissance de la programmation avec LogoWriter, un langage très simple qui permet de dessiner à l'aide des concepts de base de la programmation : boucles, structures de contrôle, etc.

Le code qui suit permet de dessiner une plante bidimensionnelle.

from turtle import *

def reset(x, y):
    r"""
    Moves the turtle to position (x, y) without
    drawing anything and sets the angle to 90.
    """
    penup()
    setpos(x, y)
    pendown()
    setheading(90)

def f(height, resolution):
    r"""
    Draws a plant of given height and given
    resolution.

    The highest the resolution is, the more
    detailed the plant is drawn. For instance,
    if the resolution is 1, then the basic
    plant is drawn. If the resolution is 3,
    then the plant presents many details.
    """
    if resolution == 0:
        forward(height)
    else:
        # Drawing the bottom
        f(height / 3.0, resolution - 1)

        # Drawing the right branch
        right(30)
        f(height / 3.0, resolution - 1)
        penup()
        backward(height / 3.0)
        pendown()

        # Drawing the middle
        left(30)
        f(height / 3.0, resolution - 1)

        # Drawing the left branch
        left(30)
        f(height / 3.0, resolution - 1)
        penup()
        backward(height / 3.0)
        pendown()

        # Drawing the top part
        right(30)
        f(height / 3.0, resolution - 1)

# Drawing parameters
height = 300                                    # height of plants
ss     = ['slowest', 'slow', 'fast', 'fastest'] # speeds
xs     = [-240, -80, 80, 240]                   # x positions of plants
y      = -100                                   # y position of plants

# Draw plants
for i in range(4):
    speed(ss[i])
    reset(xs[i], y)
    f(height, i + 1)

exitonclick()

Voici ce qu'on obtient :

Plantes fractales

Le lecteur intéressé trouvera plus de détails ici.

comments powered by Disqus