Uno stelo che cresce verso la luce

Cresce per accrescimento: a ogni fotogramma si aggiunge un punto in cima, mentre i punti già aggiunti restano dove sono. Come una pianta, cresce solo quando c’è luce e piega la punta verso la sorgente, così la forma finale conserva il percorso della luce.

Tenere premuto il mouse sul canvas per accendere la luce.

    let xs = [335, 335];   // punti dello stelo, dalla base alla punta
let ys = [240, 235];

function setup() {
    createCanvas( 670, 240 );
}

function draw() {
    background( 32 );
    let n = xs.length - 1;                   // indice della punta
    if (mouseIsPressed && ys[n] > 20) {
        xs.push( lerp( xs[n], mouseX, 0.002 ) + noise( n * 0.02 ) - 0.5 );
        ys.push( ys[n] - 0.5 );
        noStroke();
        fill( 255, 230, 0 );
        circle( mouseX, mouseY, 20 );            // luce  
    }
    stroke( 70, 150, 50 );
    for (let i = 1; i <= n; i++) {
        strokeWeight( map( i, 0,n, 6,1 ) );
        line( xs[i-1], ys[i-1], xs[i], ys[i] );  // segmenti stelo
    }
}
  

Algoritmo

a ogni fotogramma:                                                draw()
    se la luce è accesa e lo stelo non ha raggiunto la cima:      if()
        aggiungere un punto, mezzo pixel sopra la punta           push()
        spostarlo un poco verso la luce                           lerp()
        e un poco a caso, di lato                                 noise()
        disegnare la luce
    unire i punti, con lo spessore che diminuisce verso la punta  for()

Istruzioni


  

Il punto nuovo ha la x della punta spostata di due millesimi della distanza che la separa dalla luce: la piega è più forte quando la luce è lontana, e la punta le si avvicina senza mai raggiungerla.


  

noise() restituisce un valore fra 0 e 1 che cambia poco da un punto al successivo: meno 0.5, diventa uno scarto fra -0.5 e 0.5 pixel, che per un tratto piega lo stelo verso un lato e poi verso l’altro, senza scatti.


  

Lo spessore va da 6 pixel alla base a 1 in cima. Dato che n cresce, ogni tratto diventa più spesso a mano a mano che lo stelo si allunga.

Variazioni

Con 0.01 al posto di 0.002 lo stelo si piega subito verso la luce, quasi in orizzontale.

Con noise( n * 0.1 ) le ondulazioni dello stelo diventano più fitte.