Feuillages

Notes de travail plutôt absconses.
16 juin 2018

Un jardin sans feuillage serait d’une tristesse accablante. Je suis donc en train de construire un système avec lequel je pourrai affubler mes branches artificielles de différents types de feuillage. Ce faisant, j’ai pris beaucoup de notes très techniques et qui ne seront pas nécessairement digestes pour quiconque, mais je les partage tout de même ci-dessous, afin de documenter mon processus.

Les croquis ci-dessus proviennent des mêmes recherches. Ce travail a aussi mené à la création d’une première animation, partagée sur mon fil Twitter.

Physiologie d’une feuille

Il me faut un prototype Leaf. Je dois pouvoir avoir des feuilles paripennées, imparipennées, bipennées et tripennées. Aussi, des feuilles palmées.

Tout commence avec un pétiole. La pétiole peut être de longueur 0, ce qui créerait une feuille sessile. Depuis le Wiktionnaire : Sessile, qui ne possède pas d’attache apparente et semble donc directement fixé au support sans l’intermédiaire d’un pied, d’un stipe, d’un pétiole ou d’un pédicelle. Le pétiole doit être séparé en segments, tout comme les branches de la plante. Au fond, un pétiole partage presque toutes les mêmes caractéristiques que les branches… Pourrais-je imaginer qu’un pétiole, ici, serait simplement la branche ou les quelques dernières branches auxquelles sont attachées une feuille ?

Mais ce serait bien qu’un pétiole puisse avoir une structure d’embranchement différente de celle de la plante à laquelle il est attaché.

Un pétiole est divisé en segments. Ces segments peuvent générer des folioles ou d’autres pétioles. Si un pétiole ne génère qu’un seul foliole, nous avons une feuille unifoliée.

Le pied du pétiole s’appelle le nœud. Il y aussi la stipule qui est connectée au nœud. Les “sous-pétioles” s’appellent des pétiolules. Et les segments d’un pétiole qui s’étendent après la première “division” du pétiole s’appelent des rachis. Est-ce que les rachis sont aussi des pétiolules et vice versa ?

En partant, le génome doit contenir un gêne qui exprime le niveau de divisions du pétiole. 0 signifiant que le pétiole ne se divise pas, 1 qu’il se divise une seule fois, et ainsi de suite. Il devrait y avoir une limite, mais je ne sais pas laquelle. Disons 3, pour obtenir des feuilles tripennées. Ça semble être la limite selon Wikipedia. Donc, lors que ce gêne est d’une valeur de 3… Les segments de pétioles doivent contenir une propriété petioluleLevel qui est initialisée à 0 lorsque le premier segment de pétiole est créé. Ensuite, lorsqu’un segment de pétiole crée un embranchement, il crée un nouveau segment de pétiole avec une propriété petioluleIndex de 1. C’est exactement la même chose que la propriété segmentID que j’ai présentement dans mon prototype Tree.

Il y a vraiment beaucoup de concepts qui seront tout simplement copiés de mes structures d’embranchement pour le corps de la plante, mais je crois néanmoins qu’il est plus pratique de créer un système indépendant pour les feuilles. Notamment parce que, contrairement aux branches, la création des folioles ne semblent pas du tout varier par le hasard. Une feuille paripennée et alterne, par exemple, n’omet aucune foliole tout au long de son pétiolule (enfin, je pense bien).

let DNA = function() {
    // Energy
    this.initialEnergy = 30;
    this.energyLoss = 0.9;
    this.branchGrowthCost = 0.01;
    this.branchingCost = 0.02;

    // Branching struture
    this.branchGrowth = 0.1;
    this.branchingAngle = Math.PI * 0.5;
    this.branchingProbability = 0.25;
    this.branchingFrequencyLeft = 9;
    this.branchingFrequencyRight = 9;
    this.branchingOffsetLeft = 3;
    this.branchingOffsetRight = 0;

    // Leaf structure
    this.petioleSegmentGrowth = 0.1;
    this.petioleMaxBranchings = 3;
    this.petioleMaxSegmentLength = 10;
    this.petioleSegmentsToLeaflet = 10;
    this.petioleMaxAngle = Math.PI * 0.15;
    this.petioleFrequencyLeft = 9;
    this.petioleFrequencyRight = 9;
    this.petioleOffsetLeft = 3;
    this.petioleOffsetRight = 0;
    this.petioluleDepth = 3;
    this.petioleTerminalLeaflet = 0;
    this.petioleMaxLeafletAmount = 10;
};

Pour l’instant, je nomme petioluleDepth le niveau maximal de subdivisions du pétiole. Donc, lorsque petioluleDepth == 2, nous avons une feuille bipennée. La propriété petioleTerminalLeaflet, quant à elle, est une booléenne qui détermine si nous avons une foliole terminale. Lorsque petioluleDepth == 0, petioleTerminalLeaflet doit forcément être true, puisque si ce n’était pas le cas, la feuille n’aurait tout simplement pas de foliole.

La propriété petioleSegmentsToLeaflet déterminera combien de segments séparent la foliole du “pied” du pétiole.

Les folioles pourraient pousser à des moments différents. Par exemple, le long d’un pétiole ou d’un pétiolule, les folioles du “bas” pourraient se mettrent à pousser avant même que les folioles suivants existent. Au final, ça n’aurait pas une grande conséquence.

Oh, peut-être que la propriété petioleMaxLeafletAmount pourrait rendre la propriété petioleTerminalLeaflet inutile. Si petioleMaxLeafletAmount == 1, nous avons un

Les feuilles pennées et les feuilles palmées ne devraient pas être compatibles.

La propriété petioleSegmentsToLeaflet

La propriété petioleSegmentsToLeaflet est utilisée lorsqu’un segment donné a une propriété (this.petioluleIndex == this.dna.petioluleDepth).

Les feuilles seront verticillées si elles sont palmées et que (this.dot.petioleMaxBranchings > 1). En fait, non.

Algorithme de structuration des feuilles pennées

Il me faut… des propriétés maxKnotsLevel0, maxKnotsLevel1, maxKnotsLevel2, maxKnotsLevel3 et maxKnotsLevel4. Un segment de pétiole doit ainsi connaître la quantité de nœuds que lui et ses enfants peuvent encore produire. Lorsqu’il y a un embranchement forward, nous ne changeons pas de petioleLevel. Lorsqu’il y a un embranchement left ou right, nous incrémentons this.petioleLevel de 1 et donnons à la propriété this.knots la valeur 0. Un petioleSegment est ainsi initialisé avec une propriété knots qui dépend de son embranchement d’origine.

Lorsque (this.petioleLevel == this.dna.this.petioluleDepth), nous avons affaire à un pétiolule qui formera enfin une foliole. Il ne peut plus y avoir d’embranchement left ou right.

Lorsque (this.dna.petioleTerminalLeaflet == 1), le dernier knot qui est permis créera aussi, spécialement, un dernier embranchement forward, qui lui, exceptionnellement, incrémentera la propriété petioluleLevel de 1, de façon à créer une autre foliole vers l’avant.

Il me faut aussi des propriétés petioleMaxSegmentLengthLevel0, petioleMaxSegmentLengthLevel1, petioleMaxSegmentLengthLevel2, petioleMaxSegmentLengthLevel3 et petioleMaxSegmentLengthLevel4.

Un pétiolule peut se former à gauche ou à droite lorsque… sa propriété this.knots est plus petite que sa propriété knots. Mais comment calculer sa propriété knots?

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.