Pour détecter la collision entre deux branches, il n’est pas possible de calculer les distances entre les éléments, la complexité étant alors en (complexité à croissance polynomiale) ce qui est ingérable pour la taille de la tapisserie. Pour avoir un algorithme en (complexité constante), je fait un dessin “brouillon” dans un espace mémoire interne en vérifiant que les nouveaux points ne se dessine pas par dessus des points existants.

arbreBloque

La croissance a été bloquée, grille trop grande.

Pour améliorer ce dessin “en gros”, on différencie les points de test d’impact (un point central d’une feuille par exemple), des points de dessin (toute la feuille avec des marges). Ceci évite en grande partie d’être trop exigeant et permet le dessin des feuilles sans être bloquant.

Pour éviter de devoir spécifier chaque point de blocage (ils peuvent être nombreux), on a un paramètre “fuzzy” sur la grille qui en ajoute.

Voici le même dessin que ci-dessus mais avec une grille plus petite et du “fuzz” :

arbre2

La croissance n’est plus bloquée, mais la grille impose une régularité.

Pour résoudre ce problème de régularité, il faut que la grille soit plus petite, sans trous. Du coup j’ai ajouté une fonction “fuzz” définie dans la tige: les points d’impact continuent de grandir (comme une tache d’encre) jusqu’à une certaine limite:

fuzz

Le fuzz fait des très jolis dessins, mais ça marche pas.

C’est joli, mais inefficace. On reste avec des réglages d’horloger sur la taille de la grille et le nombre de points d’impact. Euhh, non. On corrige les bugs:

fuzzOk

Meilleure gestion des points fuzz (expansion avant pousse des tige).

Résultat en svg:

arbreEscaliers

Poussée en escaliers à cause des points d’impact définis dans l’axe.