Menu Close

Fractal de la curva del dragón

La curva del dragón es un fractal que se construye siguiendo los siguientes pasos:

  • A partir de un segmento, se construye el triángulo rectángulo e isósceles, como lo muestra las dos primeras figuras. Luego se borra el segmento inicial.
  • Se repite varias veces el proceso de remplazar un segmento por otros dos para cada línea de la curva, alternando siempre la orientación de los triángulos.

La siguiente figura muestra los trece primeros pasos:
Formación_de_la_curva_del_dragón

El ejercicio consiste en definir (en CodeWorld) la función

   dragon :: Number -> Picture

tal que dragon(n) es el dibujo correspondiente al paso n de la construcción de la curva del dragón. Por ejemplo, el dibujo de dragon(20) es
Dragon

Comentarios

  1. La descripción de la curva dragón es la que se encuentra en el artículo de la Wikipedia.
  2. Una definición análoga es la del fractal de la curva de Koch.

Soluciones

main = pictureOf(translate(dragon(20), 1, -2))
 
dragon :: Number -> Picture
dragon(0) = line[(-6, 0), (6, 0)]
dragon(n) = translate(rotate(sub, 45),  -3, 3) &
            translate(rotate(sub, 135), 3, 3)
  where sub = scale(dragon(n-1), 1 / sqrt(2), 1 / sqrt(2))

2 soluciones de “Fractal de la curva del dragón

  1. Diego
    main = pictureOf (dragon 15)
    inicio = [(-5,0),(5,0)]
     
    dragon :: Number -> Picture
    dragon n = line (dragonAux n inicio)
      where dragonAux 0 ps = ps
            dragonAux m ps = dragonAux (m-1) (paso ps 1)
     
    paso ((x1,y1):(x2,y2):ps) d = 
      let vx = x2-x1
          vy = y2-y1 in
      (x1,y1) : (x1+(vx-d*vy)/2, y1+(d*vx+vy)/2) : paso ((x2,y2):ps) (-d)
    paso xs _ = xs

    Intentaré hacerlo también con las funciones específicas de CodeWorld.

    • Diego

      Una mejor solución:

      main = pictureOf (dragon 15)
       
      dragon :: Number -> Picture
      dragon 0 = line [(0, 0), (8, 0)]
      dragon n = pictures [rotate (subDragon, 45),
                           translate (rotate (subDragon, 135), 8, 0) ]
          where subDragon = scale (dragon (n-1), (sqrt 2)/2, (sqrt 2)/2)

Escribe tu solución

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.