Dio che ha creato gli alberi ha utilizzato un canvas 3d oltre ad averli farciti di casualità e di grande complessità ma probabilmente sull’algoritmo che di base potrebbe essere minimalmente il seguente.
Passaggio 1: se un ramo è abbastanza lungo, collegare due rami ad esso: uno a sinistra e uno a destra. Entrambi i nuovi rami dovrebbero essere leggermente più corti del ramo principale.
Passaggio 2: ripetere il passaggio 1 per entrambi i nuovi rami
Step 1: If a branch is long enough, attach two branches to it: one on the left, and one on the right. Both the new branches should be slightly shorter than their parent branch.
Step 2: Repeat Step 1 for both the new branches
Ecco il risultato del video….
Cerchiamo di capire come funziona il concetto di ricorsione per disegnare l’albero. Guarda il video e ricostruisci il codice che eseguo.
function draw(startX, startY, len, angle,branchWidth) {
ctx.beginPath();
ctx.save();
ctx.translate(startX, startY);
ctx.rotate(angle * Math.PI/180);
ctx.moveTo(0, 0)
ctx.strokeStyle = "darkgreen";
ctx.fillStyle = "green";
ctx.lineWidth = branchWidth;
ctx.lineTo(0, -len);
ctx.stroke();
if(len <7) {
ctx.beginPath();
ctx.arc(0, -len, 5, 0, Math.PI/2);
ctx.fill();
ctx.restore();
return;
}
draw(0, -len, len*0.8, angle-10,branchWidth*0.8);
draw(0, -len, len*0.8,angle+10,branchWidth*0.8);
ctx.restore()
}
Se hai fatto attenzione la funzione draw richiama se stessa molte volte ed ogni volta i suoi parametri cambiano. La ricorsione è la tecnica utilizzata per disegnare l’albero.
Per ricorsione si intende semplicemente il richiamare una funzione all’interno della definizione di se stessa, o in altre parole, una funzione è definita ricorsivamente quando nella sua definizione appare un riferimento
(chiamata) a se stessa. Ad ogni richiamo aumenta la “profondità” dell’elaborazione fino al raggiungimento dello scopo, momento in cui la funzione ritorna.
Molti linguaggi di programmazione offrono la possibilità di definire funzioni o procedure ricorsive; JavaScript naturalmente è uno di questi. Facciamo un esempio tanto per schiarirci le idee, vediamo una banale funzione (non ricorsiva) per il calcolo della somma di due numeri:
12345 | function somma(a,b){ return document.write(a + b);} |
Vediamo ora lo stesso esempio attraverso una funzione ricorsiva:
12345 | function somma(a,b) { return b > 0 ? somma(a + 1, b – 1) : document.write(a);} |