Botanique évolutive

Croisements entre la botanique algorithmique et les algorithmes génétiques.
5 mai 2018

La botanique algorithmique est un très beau champ d’étude dans les sciences informatiques. Le botaniste hongrois Aristid Lindenmayer en est un des pionniers, et le livre The Algorithmic Beauty of Plants qu’il a co-signé avec l’informaticien Przemysław Prusinkiewicz est la plus riche et exhaustive référence le sujet. Le livre est disponible gratuitement, en entier, sur un site Web hébergé par l’Université de Calgary, où Prof. Prusinkiewicz enseigne. Il s’agit d’un site Web formidable qui contient une foule de documents intéressants concernant la botanique algorithmique.

J’ai fait plusieurs expériences pour apprendre appliquer différents aspects de la botanique algorithmique afin d’en faire des animations. La première animation que j’ai réalisée (et dont l’image ci-dessus est extraite) se trouve sur mon fil Twitter. J’ai rassemblé ci-dessous quelques notes de travail prises lors de la réalisation de cette animation et des autres qui suivront.

Code source

Le code écrit lors de la réalisation de ces expérimentations se trouve sur GitHub. Il s’agit d’un projet assez gros et le travail est réparti sur plusieurs branches de l’arborescence Git.

Notes de travail

Il me faut tout d’abord un prototype d’objet Tree. Je veux pouvoir enregistrer des formes dans une liste de formes, et ensuite, je pourrai déterminer combien de formes je veux dessiner par image d’animation.

L’objet Segment

Comment pourrait être défini un segment ? Un segment ne devrait pas avoir de coordonnées x et y mais plutôt des propriétés l pour sa longueur et w pour sa largeur. Et une propriété parent, bien entendu. Les seules coordonnées x et y qui doivent exister dans un arbre seront assignées au point initial de l’arbre.

Et si un segment ne recevait en arguments que parent et dna et qu’il devait tout construire seulement avec cela ? Puisqu’il connaît son parent, il peut « réagir » à lui. Un segment devient une sorte d’automate cellulaire dont le « voisin » est son parent, et dont les règles sont toutes encodées dans sa propriété dna. Ça me semble être un bon système.

let Segment = function(parent, dna) {
    // ???
};

L’âge de l’arbre

L’âge de l’arbre devrait pouvoir influencer l’expression de ses gênes. Par exemple, l’angle dans lesquel s’étend un nouvel embranchement doit pouvoir dépendre de l’âge de l’arbre. Un arbre plus vieux pourrait être en mesure de créer des embranchements à angles plus grands ou plus courts. Donc, un objet Segment doit connaître l’âge de l’arbre à tout moment. Ou alors n’aurait-il qu’à connaître l’âge de son parent ? Ça serait peut-être mieux ainsi. Tout Segment ne connaîtrait ainsi que l’âge de son parent, et prendrait des « décisions » en conséquence.

Les embranchements

Les embranchements constituent un des plus compliqués aspects du système. Il doit y avoir trois sortes d’embranchements : à gauche, tout droit et à droite. Il me semble clair qu’un embranchement « tout droit » ne doit pouvoir se faire qu’une seule fois puisqu’il représente, d’une certaine, l’extension naturelle du rameau ; mais les embranchements à gauche et à droite sont nettement plus compliqués.

Les embranchements « tout droit » serviront tout d’abord à créer des branches croches, et aussi à laisser des embranchements pousser « le long » d’une branche : un embranchement ne signifiera pas nécessairement la fin apparente d’un segment.

L’épaisseur des rameaux

Il me faudra aussi un système de rameaux à épaisseurs variables.

Contexte

Cette note de blog fait partie de mon projet de recherche Vers un cinéma algorithmique, démarré en avril 2018. Je vous invite à consulter la toute première note du projet pour en apprendre davantage.