L-Systèmes : Morphogénèse des plantes
November 13, 2010
Laurent Orseau <laurent orseau@agroparistech fr>
Antoine Cornuéjols <antoine@lri fr>
1 Introduction
La récursion, qui est le principe de base des langages de programmation fonctionnels
tels Scheme, Lisp ou Caml, est au coeur de nombreux systèmes vivants (notamment
la plupart des organismes pluri-cellulaires). En effet, la duplication est une forme de
récursion puisqu’il s’agit de "faire la même chose". Cette duplication peut être iden-
tique ou différer selon certaines caractéristiques, comme lorsqu’une reine fourmi donne
vie à différents types de fourmis. Il en va de même lors de la croissance d’organisme
multicellulaires : les cellules se répliquent localement, pour donner naissances à de
nouvelles cellules qui se répliqueront aussi et ainsi de suite.
La récursion est en fait une forme plus générale que l’itération telle qu’on la voit
dans les langages de programmation impératifs comme le C ou le Pascal, avec les
boucles for, while, reapeat until, ... En effet, il est possible de faire toute itération en
récursion, mais l’inverse n’est pas vrai. Les langages impératifs permettent d’ailleurs
de faire de la récursion, mais ils ne sont généralement pas créés pour cela.
Les itérations (seules) ne permettent pas de prendre en compte que les cellules qui
se répliquent peuvent donner naissances à plusieurs cellules qui vont toutes refaire la
même opération. Une itération ne fait qu’une seule chose à la fois. (Pour contourner
ce problème, il est nécessaire de passer par une mémoire sous forme de tableau ou de
liste.)
En revanche, la modélisation d’un tel processus est direct en récursion, car c’est ce
que fait exactement la récursion. Nous allons voir le lien très fort qui existe entre la
morphogénèse des plantes et le principe de récursion.
1
2 L-Systèmes
Le biologiste Aristid Lindenmayer (1926-1989) a modélisé la croissance de plantes par
un tel processus récursif. Avec un outil graphique adéquat, il est possible de représenter
des plantes qui semblent "naturelles".
Une feuille d’érable. Une feuille générée par 10 lignes de
Scheme.
Une fougère générée par L-système (une quinzaine de lignes de Scheme).
2.1 Turtle Graphics
Commençons pour définir le langage de dessin : nous allons recréer le langage LOGO.
C’est un outil de dessin très simple à destination pédagogique, inventé par Seymourt
2
Papert en 1967. Il est très simple à utiliser, mais parce qu’il peut faire de la récursion,
il peut générer des dessins très complexes.
Le principe est de contrôler une "tortue" qui se déplace sur la fenêtre d’affichage
en avançant d’une certaine distance, soit en laissant une marque au sol (tirer un trait)
soit non, ou en tournant d’un certain angle.
Une tortue est donc définie par sa position en x et en y ainsi que par son angle (par
défaut le 0 est l’Est).
Question 1
Commencez par créer une fenêtre graphique et affichez-la :
Question 2
Définissons maintenant une tortue initiale. Créez une fonction :
qui renvoie une tortue, c’est-à-dire une liste contenant la position en x et en y ainsi que
l’angle initial. Il est conseillé de placer la tortue vers (300, 400) mais vous pouvez et
pourrez changer ces valeurs à votre convenance.
Question 3
Comme dans les TP précédents, créez les accesseurs , et perme-
ttant d’extraire d’une tortue (une liste) la valeur correspondante.
Question 4
Créez une fonction :
qui renvoie la tortue tournée d’un angle .
Question 5
Créez une fonction :
qui renvoie la tortue déplacée d’une longueur dans la direction donnée par son
angle. La tortue est déplacée sans rien dessiner.
Attention, les fonctions prédéfinies et prennent des radians en entrée, mais
il est plus confortable pour la suite du TP d’utiliser des degrés. Il vous faudra donc les
convertir. Il est conseiller de créer une fonction intermédiaire :
3
qui permet d’effectuer la conversion.
Question 6
La fonction :
permet de tracer à l’écran une ligne dans la fenêtre graphique, de , à
, .
Créez une fonction :
similaire à mais qui, en plus de renvoyer la nouvelle tortue, dessine un trait à
l’écran de son ancienne position à la nouvelle.
2.2 Appels imbriqués
Puisque chacune des fonctions définies prend une tortue et retourne la nouvelle tortue,
il faut imbriquer les appels à ces fonctions pour générer des séquences de dessin. Par
exemple, prenons l’appel :
En Scheme, ce sont les appels de fonction les plus profondément imbriqués qui sont
exécutés en premier. Ici, on crée donc d’abord une tortue, puis on la fait avancer de 100
tout en traçant une ligne, puis on la fait tourner de 20 degrés, puis on la fait avancer de
50 en dessinant.
Vous pouvez dors et déjà vous amuser un peu avec ces primitives graphiques pour
bien les prendre en main.
3 Un premier exemple récursif
Tout l’intérêt de ce système graphique réside dans la récursion.
Définissez la fonction suivante :
4
Evidemment, lisez-là et comprenez-là.
Le permet de n’exécuter une suite d’expressions que si la condition donnée
est vérifiée :
condition
expression1
expression2
expression-fin
La valeur de retour du est la valeur de expression-fin.
À la fin de votre programme, exécutez un appel à cette fonction :
Notez que cet appel est à l’intérieur d’un appel à , qui permet de pré-
parer la fenêtre pour le dessin et de faire les pré-traitements et post-traitements néces-
saires.
Modifiez la fonction , essayez diverses choses, amusez-vous avec le lan-
gage graphique !
Un nautile
4 Quelques devinettes
Question 7
Créez une fonction :
qui dessine un trait de longueur n (en avançant la tortue), appelle avec la moitié
de et la tortue tournée d’un angle de 90vers la droite, puis appelle avec la moitié
de et la tortue tournée d’un angle de 90vers la gauche. La récursion doit s’arrêter
lorsque a une valeur inférieure à 1. Puis faites l’appel suivant :
5
1 / 8 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !