Arbre génératif

  Sketch Arbre  Sketch Bamboo


  • BARRE D'ESPACEMENT : Retracer
  • SPACEBAR : Redraw

En programmation, deux techniques de répétition sont utilisées: la récursion et l'itération. Bien que les deux soient vraisemblablement interchangeables, l'utilisation de l'une ou de l'autre permet souvent de simplifier le code et/ou d'accélérer les calculs. Par exemple, employer un algorithme récursif pour calculer la suite Fibonacci diminuerait l'efficience de l'algorithme.

Bien souvent, l'arbre est donné comme exemple classique d''utilisation d'un algorithme récursif. La branche constitue l'unité de base du modèle. Celle-ci s'appelle elle-même plusieurs fois à chaque génération. Au fil des appels récursifs, on passe du tronc jusqu'aux derniers rameaux.

Explication du code

Tout d'abord, la branche étant l'unité de base, une classe nommée "Branch" est créée. Celle-ci regroupera les données et les méthodes spécifiques à la branche. Dès lors, il vaut mieux choisir de quelle façon les branches seront représentées puisque celà influencera notre choix de variables et de méthodes. Dans le cas présent, chaque branche se dessine grâce à un disque qui se déplace dans le plan.

Définissons les variables. Le disque doit avoir une position (pos) largeur (diam). Concernant son déplacement, nous devons lui attribuer une vitesse (speed), un angle (ang), une unité de ralentissement (speedDecr) afin que la branche ne se poursuive pas indéfiniment et une booléenne (growing) nous indiquant quand la branche a terminé sa croissance. Pour un effet d'irrégularité, des variables reliés au bruit Perlin sont ajoutées. Reste le plus important, soit la variable du nombre de générations qui servira à limiter la récursion, le "base case", ainsi qu'à adapter l'apparence des branches selon la génération des instances de la classe Branch.

Pour ce qui est de méthodes, trois sont définies en plus du constructeur: la méthode de déplacement et de modification de l'apparence (grow), celle de la récursion (multiply) et celle de l'affichage (display).

L'arbre se trouve donc à être un ArrayList de branches. On débute avec une seule branche. Tant qu'elle n'atteint pas le nombre de génération maximal, chaque branche peut se multiplier autant de fois que le calcul de probabilité lui permet (un nombre aléatoire modulo une constante égale zéro).