Ricorsione per generare alberi: codice

    function disegnaRamo(x, y, angolo, livello) {

    let lunghezza = pow( 0.6, livello ) * 130;
    let x2 = x + cos(angolo) * lunghezza;
    let y2 = y + sin(angolo) * lunghezza;
    line(x, y, x2, y2);

    livello++;
    if (livello < 7) {
        let deviazione = 0.75;
        disegnaRamo(x2, y2, angolo+deviazione, livello);
        disegnaRamo(x2, y2, angolo-deviazione, livello);
    }
}

function setup() {
    createCanvas(360, 320);
    frameRate(1);
}

function draw() {
    background(255);
    disegnaRamo( width/2, height, PI*1.5, 0 );
}
  

  

Funzione (ricorsiva) che disegna un segmento a partire dalle coordinate x, y con una direzione indicata da angolo e per una lunghezza ricavata attraverso livello.


  

La lunghezza del ramo parte da 130 pixel e si riduce al 60% a ogni livello di ricorsione.


  

Le coordinate dell’estremità finale del segmento vengono ricavate usando la conversione da coordinate polari (angolo, lunghezza) a coordinate cartesiane.


  

La funzione chiama se stessa due volte: una volta con un angolo maggiore e una con un angolo minore a quello di base.


  

Avvia la ricorsione a partire dal centro del bordo inferiore del canvas procedendo verso l’alto (PI*1.5) e con il livello iniziale impostato a zero.

Rompere la simmetria facendo impostare deviazioni casuali dell’angolo dei rami, ad esempio con:


  

Rompere la regolarità delle lunghezze dei rami usando un valore di base casuale diverso da 130, ad esempio con


  

Prima dell’istruzione line(), impostare gli attributi grafici della linea in base al valore di livello o casualmente, ad esempio usando:


  

Far disegnare dei cerchi alla fine dei rami più piccoli (quando il livello è uguale a 7) aggiungendo un else all’if della funzione ricorsiva, ad esempio:


  

Seguendo tutti i suggerimenti, i risultati dovrebbero portare a qualcosa di simile:
variante