Grid, Scala y arbolitos fractales

Inspirado por

  • los arbolitos que he visto esta mañana en mi semivuelta al lago de Zúrich,
  • las cosas que estoy leyendo últimamente sobre el paquete grid de R (p.e., grid graphics, de Murrell)
  • mi curso de scala y
  • este enlace

me he decidido a reescribirlo como Dios manda (y no como de primeras se le ocurriría a un neoingeniero al que solo le han enseñado MatLab y que, por lo tanto, tiene vetado el acceso a cualquier tipo de empresa tecnológica puntera). Me ha quedado así:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
library(grid)

grid.newpage()

# datos iniciales
base  <- rbind(c(0.4, .6, 0.6, .4), c(0, 0, 0.2, 0.2))
alpha <- pi/4
r     <- 1 / cos(alpha) / 2

# funciones auxiliares
traslada <- function(rect, vect) rect + vect
encoge   <- function(rect, r) rect * r
rota     <- function(rect, a)
  matrix(c(cos(a), sin(a), -sin(a), cos(a)), 2, 2) %*% rect


fractal <- function(base, nivel){
  grid.draw(polygonGrob(base[1,],
    base[2,],
    gp = gpar(fill = ifelse(nivel < 5, "brown", "green"),
    col = 0)))

  if(nivel < 10){
    fractal(traslada( encoge( rota(
      traslada(base, -base[,1]),  alpha), r) ,
      base[,4]), nivel + 1)
    fractal(traslada( encoge( rota(
      traslada(base, -base[,2]), -alpha), r) ,
      base[,3]), nivel + 1)
  }
}

fractal(base, 1)

Espero que ni David Ruescas tenga nada que objetar.

El resultado gráfico es

arbolito

Invitados quedan mis lectores a manipular el grosor del tronco, el ángulo de rotación, el color, la transparencia, etc. para dejarlo a su gusto.