Sistemas-L y crecimiento fractal
La necesidad de acumular grandes cantidades de tejido en un volumen pequeño es una propiedad presente en la gran mayoría de organismos de la naturaleza; como por ejemplo la distribución del sistema circulatorio en el cuerpo humano. Muchos de estos sistemas exhiben propiedades fractales, y esto implica que su proceso de crecimiento es altamente complejo.
Actualmente se sabe que las instrucciones de crecimiento de estos sistemas están almacenadas eficientemente en el ADN. En 1968 la bióloga Aristid Lindenmayer inventó un formalismo que provee una descripción matemática del crecimiento de plantas, conocido como sistemas L. Los sistemas L también pueden ser usados eficientemente para describir el crecimiento de algunos monstruos matemáticos como los descritos en el capítulo anterior.
Los sistemas-L se generan a partir de una semilla llamada axión y nuevas células acopladas al axión mediante una serie de regladas llamadas reglas de producción. Estas reglas actúan a partir de un símbolo inicial (el axión), convirtiéndolo iterativamente en una cadena de símbolos a cada uno de los cuales se le asigna una regla de representación específica. Esta cadena de símbolos crece de manera enorme en cada paso, y bajo el contexto de un dispositivo que pueda interpretarla gráficamente da lugar a patrones coincidentes con tejidos presentes en la naturaleza.
A continuación se presenta una visualización del crecimiento de un sistema L mediante la librería p5.js de javascript. Se usó como semilla "FF+[+F-F-F]-[-F+F+F]".
Se uso como guía:
The Coding Train: Fractal Trees - L-System
Código fuente:
var axiom = "F";
//"F[-F]F[+F]F";
var pattern = "FF+[+F-F-F]-[-F+F+F]";
var len = 100;
//esta función genera el patrón de crecimiento
function generate () {
len *= 0.58;
parts=axiom.split("");
for(i=0; i< parts.length; i++){
switch(parts[i]){
case "F":
parts[i]=pattern;
break;
}
}
axiom = parts.join("");
turtle();
}
//esta función dibuja una iteración al ejecutarse
function turtle () {
resetMatrix();
stroke(255);
translate(width / 2, height);
parts=axiom.split("");
for(i=0; i< parts.length; i++){
switch(parts[i]){
case "F":
line(0, 0, 0, -len);
translate(0, -len);
break;
case "+":
rotate(angle);
break;
case "-":
rotate(-angle);
break;
case "[":
push();
break;
case "]":
pop();
break;
}
}
}
//función de inicialización de la librería p5
function setup () {
var canvas = createCanvas(750,750);
canvas.parent('sketch-holder');
background(10);
angle = radians(25);
turtle();
}