Un fractal es un objeto geométrico cuya estructura básica, fragmentada o irregular, se repite a diferentes escalas.
El término fue propuesto por el matemático Benoît Mandelbrot en 1975 y deriva del Latín fractus, que significa quebrado o fracturado.
Muchas estructuras naturales son de tipo fractal. Por ejemplo, el romanescu (un híbrido de brécol)
 
 
 
import Graphics.Gloss
main :: IO ()
main = display (InWindow "Tronco de arbol" (700,800) (20,20)) black dibujo
dibujo :: Picture   
dibujo = Color aquamarine (Translate 0 (-300) tronco) 
tronco :: Picture
tronco = Polygon [(30,0), (15,300), (-15,300), (-30,0)] 
import Graphics.Gloss
main :: IO ()
main = display (InWindow "Tronco y ramas" (700,800) (20,20)) black dibujo
dibujo :: Picture      
dibujo = Color green (Translate 0 (-300) troncoConRamas)
tronco :: Picture
tronco = Polygon [(30,0), (15,300), (-15,300), (-30,0)]
troncoConRamas :: Picture
troncoConRamas = 
    Pictures [ tronco,
               Translate 0 300 rama,
               Translate 0 240 (Rotate 20    rama),
               Translate 0 180 (Rotate (-20) rama),
               Translate 0 120 (Rotate 40    rama),
               Translate 0  60 (Rotate (-40) rama)
             ]
    where rama = Scale 0.5 0.5 tronco 
import Graphics.Gloss
main :: IO ()
main = display (InWindow "Arbol" (700,800) (20,20)) black dibujo
dibujo :: Picture
dibujo = Color green (Translate 0 (-300) arbol)
tronco :: Picture
tronco = Polygon [(30,0), (15,300), (-15,300), (-30,0)]
troncoConRamas :: Picture
troncoConRamas = 
    Pictures [ tronco,
               Translate 0 300 rama,
               Translate 0 240 (Rotate 20    rama),
               Translate 0 180 (Rotate (-20) rama),
               Translate 0 120 (Rotate 40    rama),
               Translate 0  60 (Rotate (-40) rama)
             ]
    where rama = Scale 0.5 0.5 tronco
arbol :: Picture
arbol = 
    Pictures [ tronco,
               Translate 0 300 ramas,
               Translate 0 240 (Rotate 20    ramas),
               Translate 0 180 (Rotate (-20) ramas),
               Translate 0 120 (Rotate 40    ramas),
               Translate 0  60 (Rotate (-40) ramas)
             ]
    where ramas = Scale 0.5 0.5 troncoConRamasObjetivo: Definir una única función con un argumento (el paso) que pinte los siguientes dibujos.
 
 
 
 
 
 
 
import Graphics.Gloss
import System.IO
main :: IO ()
main = do 
  hSetBuffering stdout NoBuffering
  putStr "Árbol fractal.  Introduce el paso [0..6]: "
  paso <- readLn
  display (InWindow "Arbol fractal" (700,800) (20,20)) black (dibujo paso)
dibujo :: Int -> Picture        
dibujo paso = Color green (Translate 0 (-300) (arbol paso))
tronco :: Picture
tronco = Polygon [(30,0), (15,300), (-15,300), (-30,0)]
arbol :: Int -> Picture
arbol 0 = tronco
arbol n = Pictures [tronco,
                    Translate 0 300 menor,
                    Translate 0 240 (Rotate 20    menor),
                    Translate 0 180 (Rotate (-20) menor),
                    Translate 0 120 (Rotate 40    menor),
                    Translate 0  60 (Rotate (-40) menor) ]
    where menor = Scale 0.5 0.5 (arbol (n-1))Objetivo: Definir una única función con un argumento (el paso) que pinte los siguientes dibujos.
 
 
 
 
 
 
 
import Graphics.Gloss
import System.IO
main :: IO ()
main = do
  hSetBuffering stdout NoBuffering
  putStr "Árbol fractal.  Introduce el paso [0..6]: "
  paso <- readLn
  display (InWindow "Arbol fractal" (700,800) (20,20)) black (dibujo paso)
dibujo :: Int -> Picture
dibujo paso = Translate 0 (-300) (arbol paso marron)
tronco :: Color -> Picture
tronco color = Color color (Polygon [(30,0), (15,300), (-15,300), (-30,0)])
arbol :: Int -> Color -> Picture
arbol 0 color = tronco color
arbol n color = Pictures [tronco color,
                          Translate 0 300 arbolMenor,
                          Translate 0 240 (Rotate   20  arbolMenor),
                          Translate 0 180 (Rotate (-20) arbolMenor),
                          Translate 0 120 (Rotate   40  arbolMenor),
                          Translate 0  60 (Rotate (-40) arbolMenor) ]
    where arbolMenor = Scale 0.5 0.5 (arbol (n-1) (masVerde color))
marron :: Color
marron = makeColor8 139 100  35 255
-- (masVerde c) es el color obtenido mezclando los colores c y verde en
-- las proporciones 1 y 0.1.
masVerde :: Color -> Color
masVerde color = mixColors 1.0 0.1 color greenLa curva de Koch es un fractal descrito por el matemático sueco Helge von Koch en 1904.
El paso es
 







import Graphics.Gloss
import System.IO
main :: IO ()
main = do
  hSetBuffering stdout NoBuffering
  putStr "Curva de Koch. Introduce el paso [0..6]: "
  paso <- readLn
  display (InWindow ("Curva de Koch - Paso " ++ show paso) 
                    (500,500) (20,20)) black (dibujo paso)
-- Longitud de los lados del triángulo inicial
longitud = 360 :: Float
dibujo :: Int -> Picture
dibujo paso =
    Color aquamarine $                                  -- colorea  
    Translate (-longitud/2) (-(longitud * sqrt 3)/6) $  -- centra el fractal
    curva paso
    
curva :: Int -> Picture
curva 0 = Line [(0, 0), (longitud, 0)]
curva n =
    Pictures [nuevaCurva,
              Translate (longitud/3) 0                        (Rotate (-60) nuevaCurva),
              Translate (longitud/2) ((longitud * sqrt 3)/6)  (Rotate   60  nuevaCurva),
              Translate (2 * longitud/3) 0                    nuevaCurva ]
    where nuevaCurva = Scale (1/3) (1/3) (curva (n-1))Construcción: Tres curvas de Koch unidas forman el copo de nieve de Koch.
Representación de los seis primeras pasos de la construcción.







import Graphics.Gloss
import System.IO
main :: IO ()
main = do
  hSetBuffering stdout NoBuffering
  putStr "Fractal copo de nieve. Introduce el paso [0..6]: "
  paso <- readLn
  display (InWindow "Fractal copo de nieve" (500,500) (20,20)) black (dibujo paso)
-- Longitud de los lados del triángulo inicial
longitud = 360 :: Float
dibujo :: Int -> Picture
dibujo paso =
    Color aquamarine $                                  -- colorea  
    Translate (-longitud/2) ((longitud * sqrt 3)/6) $   -- centra el fractal
    copoDeNieve paso
    
curva :: Int -> Picture
curva 0 = Line [(0,0), (longitud, 0)]
curva n =
    Pictures [nuevaCurva,
              Translate (longitud/3)     0                        (Rotate (-60) nuevaCurva),
              Translate (longitud/2)     ((longitud * sqrt 3)/6)  (Rotate   60  nuevaCurva),
              Translate (2 * longitud/3) 0                        nuevaCurva]
    where nuevaCurva = Scale (1/3) (1/3) (curva (n-1))
copoDeNieve :: Int -> Picture
copoDeNieve n =
    Pictures [unaCurva ,
              Translate longitud     0                          (Rotate   120  unaCurva),
              Translate (longitud/2) (-((longitud * sqrt 3)/2)) (Rotate (-120) unaCurva)]
    where unaCurva = curva nEl triángulo de Sierpinski es un fractal que se puede construir a partir de un triángulo equilátero.
El paso es
 







import Graphics.Gloss
import System.IO
main :: IO ()
main = do
  hSetBuffering stdout NoBuffering
  putStr "Sierpinski. Introduce el paso [0..6]: "
  paso <- readLn
  display (InWindow ("Sierpinski - Paso " ++ show paso) 
                    (500,500) (20,20)) black (dibujo paso)
dibujo :: Int -> Picture
dibujo paso = Color aquamarine (Translate (-150) (-125) (sierpinski paso))
-- Longitud del lado inicial
longitud = 300 :: Float
sierpinski :: Int -> Picture
sierpinski 0 = 
    Polygon [(0,0),
             (longitud/2, longitud * sqrt 3 /2),
             (longitud, 0)]
sierpinski n
    = Pictures [nuevoSierpinski,
                Translate (longitud/2) 0 nuevoSierpinski,
                Translate (longitud/4) (longitud * sqrt 3 /4) nuevoSierpinski]
      where nuevoSierpinski = Scale 0.5 0.5 (sierpinski (n-1)) 







C. Baker-Finch Graphics Package Application: Fractals.
B. Luque y A. Agea. Fractales en la Red.
Wikipedia Fractal.
Wikipedia La curva de Koch
Wikipedia El triángulo de Sierpinki