Dios que ha creado los árboles ha utilizado un lienzo 3D además de haberlos llenado de casualidad y de gran complejidad, pero probablemente sobre el algoritmo que de base podría ser minimalmente el siguiente.
Paso 1: si una rama es lo suficientemente larga, conectar dos ramas a ella: una a la izquierda y una a la derecha. Ambas ramas nuevas deberían ser ligeramente más cortas que la rama principal.
Paso 2: repetir el paso 1 para ambas ramas nuevas
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
He aquí el resultado del video….

Intentemos entender cómo funciona el concepto de recursividad para dibujar el árbol. Mira el video y reconstruye el código que ejecuto.
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()
}
Si has prestado atención, la función draw se llama a sí misma muchas veces y cada vez sus parámetros cambian. La recursividad es la técnica utilizada para dibujar el árbol.
Por recursividad se entiende simplemente llamar a una función dentro de la definición de sí misma, o en otras palabras, una función es definida recursivamente cuando en su definición aparece un referencia (llamada) a sí misma. En cada llamada aumenta la "profundidad" del procesamiento hasta alcanzar el objetivo, momento en el que la función retorna.
Muchos lenguajes de programación ofrecen la posibilidad de definir funciones o procedimientos recursivos; JavaScript naturalmente es uno de ellos. Hagamos un ejemplo tan solo para aclarar las ideas, veamos una función banal (no recursiva) para el cálculo de la suma de dos números:
| 12345 | function suma(a,b){ return document.write(a + b);} |
Veamos ahora el mismo ejemplo a través de una función recursiva:
| 12345 | function suma(a,b) { return b > 0 ? suma(a + 1, b – 1) : document.write(a);} |