Suddivisione ricorsiva dello spazio

    let palette;

function dividi( x, y, larghezza, altezza, livello ) {
    livello++;
    if (random() < 1.3 - livello*0.12) {
        if (larghezza > altezza) {
            let taglio = larghezza * random( 0.3, 0.7 );
            dividi( x, y, taglio, altezza, livello );
            dividi( x + taglio, y, larghezza - taglio, altezza, livello );
        } else {
            let taglio = altezza * random( 0.3, 0.7 );
            dividi( x, y, larghezza, taglio, livello );
            dividi( x, y + taglio, larghezza, altezza - taglio, livello );
        }
    } else {
        fill( random( palette ) );
        rect( x, y, larghezza, altezza );
    }
}

function setup() {
    createCanvas( 670, 300 );
    palette = [ color( 240 ), color( 240 ), color( 240 ),
                color( 240 ), color( 240 ), color( 220, 40, 30 ),
                color( 30, 60, 160 ), color( 250, 200, 20 ) ];
    strokeWeight( 4 );
    dividi( -2, -2, width + 4, height + 4, 0 );
}
  

  

La probabilità di dividere ancora il rettangolo diminuisce a ogni livello. Ai primi due supera 1, quindi la divisione avviene sempre, all’undicesimo diventa negativa, e la ricorsione si ferma comunque.


  

Il rettangolo viene tagliato sul lato più lungo, in un punto scelto a caso fra il 30% e il 70%, e la funzione chiama se stessa per le due parti.


  

Quando la divisione si ferma, il rettangolo viene disegnato con un colore scelto a caso dalla palette, in cui il grigio chiaro compare cinque volte e ha quindi più probabilità di uscire.


  

Il primo rettangolo sporge dalla tela di 2 pixel per lato, la metà dello spessore delle linee: i contorni esterni restano fuori, e le linee arrivano fino al bordo senza chiudere la composizione in una cornice.

Con 0.1 o 0.15 al posto di 0.12 le divisioni diventano più o meno fitte.

Con quattro autochiamate ogni rettangolo si può dividere in quattro parti uguali, invece che in due parti di dimensioni casuali.