Español   Ejemplos: Árboles.

Tres ejemplos

  1. Ramas de longitud aleatoria
  2. Ramas con ángulos aleatorios
  3. Ramas aleatorias, pero sin pasarse

Ramas de longitud aleatoria

En el primer programa, cada nueva rama mide el 75% de la longitud de la rama anterior. Si cambiamos este valor, el árbol entero se dibuja proporcionalmente más grande o pequeño.
Sin embargo, si variamos al azar este valor, entonces cada rama no tiene nada que ver con la anterior, y se crea un árbol más natural. También se ve como algunas ramas se truncan pronto, al hacerse muy cortas, y otras se alargan bastante más. La longitud se elige con ((azar 4)+6)/10, que da un valor entre 0.6 y 1.0.
El procedimiento dibuja 99 árboles al azar, con una pausa corta en medio.

# Comando de Inicio: empezar
para empezar
  repite 12
    [ nuevo subelapiz retrocede 160 bajalapiz
  haz "angulo 60 arbol 80 espera 200]
fin

para nuevo
# Inicializamos pantalla, papel, tortuga, ...
  reponetodo pontamañopantalla [400 400]
  poncolorpapel negro poncolorlapiz verde subelapiz ocultatortuga
fin

para arbol :long
  si :long< 10 [alto] # Fin de recursion si long muy pequeña
  pongrosor :long/9 # Reduce grosor lapiz al menguar la rama
  poncolorlapiz arbolcol :long # color de rama depende de long
  avanza :long giraizquierda :angulo/2
  arbol :long * elige [0.7 0.75 0.8] giraderecha :angulo
  arbol :long * elige [0.7 0.75 0.8] giraizquierda :angulo/2
  subelapiz retrocede :long bajalapiz # Volvemos a punto de partida
fin

para arbolcol :long
  haz "green redondea 2.5*(100-:long) # color depende de long
  devuelve ( lista 255 :green 0 ) # rojo si vale 0 y amarillo para 255
fin

Ramas con ángulos aleatorios

También podemos cambiar aleatoriamente el ángulo de cada rama nueva.
Ahora necesitamos dos parámetros para cada procedimiento, longitud y ángulo. La longitud sigue siendo el 75% de la anterior, como antes. El ángulo se calcula con ((azar 60)+25), que da un valor entre 25 y 85 grados.
Esto produce árboles de un aspecto, digamos, "sucio" y descuidado.

# Comando de Inicio: empezar
para empezar
  repite 12 [nuevo subelapiz retrocede 160 bajalapiz
  arbol 90 espera 200]
fin

para nuevo
# Inicializamos pantalla, papel, lapiz, tortuga, ...
  reponetodo pontamañopantalla [400 400]
  poncolorpapel negro poncolorlapiz verde subelapiz ocultatortuga
fin

para arbol :long
  si :long< 10 [alto] # Fin de recursion si long muy pequeña
  pongrosor :long/9 # Reduce grosor lapiz al menguar la rama
  poncolorlapiz arbolcol :long # color de rama depende de long
  hazlocal "angulo elige [24 32 40 48 56 64 72]
  avanza :long giraizquierda :angulo/2
  arbol :long*0.75 giraderecha :angulo # llamada a arbol con 3/4 long
  arbol :long*0.75 giraizquierda :angulo/2
  subelapiz retrocede :long bajalapiz # Volvemos a punto de partida
fin

para arbolcol :long
  haz "green redondea 2.5*(100-:long) # color depende de long
  devuelve ( lista 255 :green 0 ) # rojo si vale 0 y amarillo para 255
fin

Ramas aleatorias, pero sin pasarse

Finalmente, podemos variar el ángulo de una rama a la siguiente un valor aleatorio entre 5 y (:angulo-10)+:angulo/10, que para un ángulo de 50 grados, devuelve un valor entre 5 y 45 grados.
De nuevo, cambiar este ángulo (p.e. 70) genera diversos tipos de árboles o de arbustos.

# Comando de Inicio: empezar
para empezar
  repite 12 [nuevo subelapiz retrocede 160 bajalapiz
  haz "angulo 60 arbol 80 espera 200]
fin

para nuevo
# Inicializamos pantalla, papel, lapiz, tortuga, ...
  reponetodo pontamañopantalla [400 400]
  poncolorpapel negro poncolorlapiz verde subelapiz ocultatortuga
fin

para arbol :long
  si :long< 10 [alto] # Fin de recursion si long muy pequeña
  pongrosor :long/9 # Reduce grosor lapiz al menguar la rama
  poncolorlapiz arbolcol :long # color de rama depende de long
  hazlocal "anguloarbol :angulo*elige [0.25 0.375 0.5 0.625 0.75]
  avanza :long giraizquierda :anguloarbol
  arbol :long*0.75 giraderecha :angulo # llamada a arbol con 3/4 long
  arbol :long*0.75 giraizquierda :angulo
  giraderecha :anguloarbol
  subelapiz retrocede :long bajalapiz # Volvemos a punto de partida
fin

para arbolcol :long
  haz "green redondea 2.5*(100-:long) # color depende de long
  devuelve ( lista 255 :green 0 ) # rojo si vale 0 y amarillo para 255
fin
Probar el programa 1

Probar el programa 2

Probar el programa 3

Procedimiento a ejecutar:
empezar