En este tema se introduce algunos conceptos de programación definiendo funciones que generan dibujos.
Se usará CodeWorld/Haskell que se encuentra en https://code.world/haskell#.
import CodeWorld
main = drawingOf circunferencia
circunferencia = circle 3Ejecución en CodeWorld/Haskell: Circunferencia1
Avisos:
Line 3, Column 1: Warning:
    Top-level binding with no type signature: main :: IO ()
Line 5, Column 1: Warning:
    Top-level binding with no type signature: circunferencia :: Picture
import CodeWorld
main :: IO ()
main = drawingOf circunferencia
circunferencia :: Picture
circunferencia = circle 3Ejecución en CodeWorld/Haskell: Circunferencia2
circle :: Double -> PicturedrawingOf :: Picture -> IO ().circunferencia y main.CodeWorldimport CodeWorld
main :: IO ()
main = drawingOf circulo
circulo :: Picture
circulo = solidCircle 3Ejecución en CodeWorld/Haskell: Circulo
Comentario: La función solidCircle :: Double -> Picture.
import CodeWorld
main :: IO ()
main = drawingOf plano
plano :: Picture
plano = coordinatePlaneEjecución en CodeWorld/Haskell: Plano de coordenadas
Comentario: La función coordinatePlane :: Picture.
import CodeWorld
main :: IO ()
main = drawingOf rectangulo
rectangulo :: Picture
rectangulo = rectangle 6 3Ejecución en CodeWorld/Haskell: Rectángulo
Comentario: La función rectangle :: Double -> Double -> Picture.
Ejemplo: Modificar el programa anterior para que los lados del rectángulo tengan una anchura de 0.5.
import CodeWorld
main :: IO ()
main = drawingOf rectangulo
rectangulo :: Picture
rectangulo = thickRectangle 0.5 6 3Ejecución en CodeWorld/Haskell: Rectángulo con anchura
Comentario: La función thickRectangle :: Double -> Double -> Picture.
Ejemplo: Modificar el programa anterior para pintar un área rectangular de base 6 y altura 3.
import CodeWorld
main :: IO ()
main = drawingOf areaRectangular
areaRectangular :: Picture
areaRectangular = solidRectangle 6 3Ejecución en CodeWorld/Haskell: Área rectangular
Comentario: La función solidRectangle :: Double -> Double -> Picture.
Ejemplo: Escribir un programa para pintar el camino que pasa por los puntos (-3,3), (3,3), (-3,-3) y (3,-3).
Programa
import CodeWorld
main :: IO ()
main = drawingOf camino
camino :: Picture
camino = path [(-3,3),(3,3),(-3,-3),(3,-3)]Ejecución en Codeworld Camino
Comentario: La función path :: [Point] -> Picture
import CodeWorld
main :: IO ()
main = drawingOf triangulo
triangulo :: Picture
triangulo = polygon [(-9,-9),(0,9),(9,-9)]Ejecución en CodeWorld/Haskell: Triángulo
Comentario: La función polygon :: [Point] -> Picture
import CodeWorld
main :: IO ()
main = drawingOf curvaConEjes
curva :: Picture
curva = curve [(-4,8),(0,-8),(4,8)]
curvaConEjes :: Picture
curvaConEjes = curva <> coordinatePlaneEjecución en CodeWorld/Haskell: Curva.
Comentario: La función curve :: [Point] -> Picture
Ejemplo: Modificar el programa anterior para que la curva sea cerrada.
import CodeWorld
main :: IO ()
main = drawingOf curvaConEjes
curva :: Picture
curva = loop [(-4,8),(0,-8),(4,8)]
curvaConEjes :: Picture
curvaConEjes = curva <> coordinatePlaneEjecución en CodeWorld/Haskell: Curva cerrada.
Comentario: La función loop :: [Point] -> Picture
blank          :: Picture
thickPath      :: Double -> [Point] -> Picture`
thickPolygon   :: Double  -> [Point] -> Picture
solidPolygon   :: [Point] -> Picture
thickCurve     :: Double  -> [Point] -> Picture
thickLoop      :: Double  -> [Point] -> Picture
solidLoop      :: [Point] -> Picture
thickRectangle :: Double -> Double -> Double -> Picture
thickCircle    :: Double -> Double -> Picture
arc            :: Double -> Double -> Double -> Picture
sector         :: Double -> Double -> Double -> Picture
thickArc       :: Double -> Double -> Double -> Double -> Picture
text           :: Text -> Picture
import CodeWorld
main :: IO ()
main = drawingOf dosCuadrados
dosCuadrados :: Picture
dosCuadrados = cuadrado1 <> cuadrado2
cuadrado1, cuadrado2 :: Picture
cuadrado1 = polygon [(-3,-3),(-3,3),(3,3),(3,-3)]
cuadrado2 = polygon [(0,0),(0,6),(6,6),(6,0)]Ejecución en CodeWorld/Haskell: Dos cuadrados
Comentario: La función (<>) :: Picture -> Picture -> Picture
import CodeWorld
main :: IO ()
main = drawingOf tresCircunferencias
tresCircunferencias :: Picture
tresCircunferencias = pictures [circle 2, circle 4, circle 6]Ejecución en CodeWorld/Haskell: Tres circunferencias.
Comentario: La función pictures :: [Picture] -> Picture
import CodeWorld
main :: IO ()
main = drawingOf circulosTrasladados
circulo :: Picture
circulo = circle 1
circulosTrasladados :: Picture
circulosTrasladados =
  translated (-4) 0 circulo <>
  translated (-2) 0 circulo <>
  translated   0  0 circulo <>
  translated   2  0 circulo <>
  translated   4  0 circuloEjecución en CodeWorld/Haskell: Cículos trasladados.
Comentario: La función translated :: Double -> Double -> Picture -> Picture
import CodeWorld
main :: IO ()
main = drawingOf cuadradoRotado 
cuadrado :: Picture
cuadrado = rectangle 6 6
cuadradoRotado :: Picture
cuadradoRotado = rotated (pi/4) cuadradoEjecución en CodeWorld/Haskell: Cuadrado rotado.
rotated :: Double -> Picture -> Picturepi :: Double{-# LANGUAGE OverloadedStrings #-}
import CodeWorld
main :: IO ()
main = drawingOf textosEscalados
texto :: Picture
texto = text "I1M"
textosEscalados :: Picture
textosEscalados =
  translated 0 8    texto <> 
  translated 0 5    (scaled 2 3 texto) <>
  translated 0 0    (scaled 3 5 texto) <>
  translated 0 (-7) (scaled 5 8 texto) Ejecución en CodeWorld/Haskell: Texto escalado.
scaled :: Double -> Double -> Picture -> Picture{-# LANGUAGE OverloadedStrings #-}import CodeWorld
main :: IO ()
main = drawingOf dosCuadradosColoreados
cuadrado :: Picture
cuadrado = solidRectangle 4 4
cuadradoRojo :: Picture
cuadradoRojo = colored red cuadrado
cuadradoVerde :: Picture
cuadradoVerde = colored green cuadrado
dosCuadradosColoreados :: Picture
dosCuadradosColoreados =
  cuadradoVerde <>
  translated 2 2 cuadradoRojoEjecución en CodeWorld/Haskell: Dos cuadrados coloreados.
Comentario: La función colored :: Color -> Picture -> Picture
Ejemplo: Modificar el programa anterior para dibujar el rojo sobre el verde.
import CodeWorld
main :: IO ()
main = drawingOf dosCuadradosColoreados
cuadrado :: Picture
cuadrado = solidRectangle 4 4
cuadradoRojo :: Picture
cuadradoRojo = colored red cuadrado
cuadradoVerde :: Picture
cuadradoVerde = colored green cuadrado
dosCuadradosColoreados :: Picture
dosCuadradosColoreados =
  translated 2 2 cuadradoRojo <>
  cuadradoVerdeEjecución en CodeWorld/Haskell: Dos cuadrados coloreados.
Comentario: capas de dibujos.
import CodeWorld
main :: IO ()
main = drawingOf semaforo
marco :: Picture
marco = rectangle 2.5 7.5
luz :: Color -> Double ->  Picture
luz c dx = colored c (translated 0 dx (solidCircle 1))
semaforo :: Picture
semaforo =
  luz red    2.5    <>
  luz yellow 0      <>
  luz green  (-2.5) <>
  marcoimport CodeWorld
main :: IO()
main = drawingOf dibujo
dibujo :: Picture
dibujo = pictures [ translated 0 4    (rectangulo red)
                  ,                   rectangulo yellow
                  , translated 0 (-4) (rectangulo purple) ]
rectangulo :: Color -> Picture
rectangulo c = colored c (solidRectangle 16 4)Ejecución en CodeWorld/Haskell: Bandera.
Comentario: Pueden servir como ejercicio pintar banderas de la galería de banderas de la Wikipedia.
import CodeWorld
main :: IO ()
main = animationOf cuadrado 
cuadrado :: Double -> Picture
cuadrado t = rotated t (colored red (rectangle 7 7))Ejecución en CodeWorld/Haskell: CuadradoGirando
animationOf :: (Double -> Picture) -> IO ()import CodeWorld
main :: IO ()
main = animationOf circulo
circulo :: Double -> Picture
circulo t = translated (9*sin(t-9)) 0 (colored red (solidCircle 1))Ejecución en CodeWorld/Haskell: CirculoTrasladado
Comentario: La función sin :: Double -> Double
import CodeWorld
main :: IO ()
main = animationOf circulo
circulo :: Double -> Picture
circulo t = colored red (solidCircle (8 * sin t))import CodeWorld
main :: IO ()
main = animationOf reloj
reloj :: Double -> Picture
reloj t = pictures [ minutero t,
                     segundero t,
                     fondo]
fondo :: Picture
fondo = colored cyan (solidCircle 7)
minutero :: Double -> Picture
minutero t = rotated (-(2*pi/3600)*t) (thickPath 0.1 [(0,0), (0,7)])
segundero :: Double -> Picture
segundero t = rotated (-(2*pi/60)*t) (path[(0,0), (0,7)])import CodeWorld
main :: IO ()
main = animationOf escena
escena :: Double -> Picture
escena t = ruedaNoria t <> fondo t
fondo :: Double -> Picture
fondo t =  nubeMovida t <> suelo <> cielo
suelo :: Picture
suelo = colored (light green) (translated 0 (-8) (solidRectangle 20 4))
cielo :: Picture
cielo = colored (light blue) (solidRectangle 20 20)
nubeMovida :: Double -> Picture
nubeMovida t =
  translated (fromInteger (rem (round (2*t)) 28) - 14) 8 nube
nube :: Picture
nube = colored white (   translated     0 (-0.4) (solidCircle 1.6)
                      <> translated (-1.2)  0.4  (solidCircle 1.2)
                      <> translated     1   0.2  (solidCircle 1.2))
ruedaNoria :: Double -> Picture
ruedaNoria t = parteMovil t <> parteFija
parteFija :: Picture
parteFija =
     colored (gray 0.5) (solidPolygon [(-8,-8),(0,-4),(8,-8)])
  <> colored (gray 0.3) (solidRectangle 0.4 10) 
  
parteMovil :: Double -> Picture
parteMovil t =
     rotated t rueda 
  <> caminoCircular coche ((pi/3) * 0 + t)
  <> caminoCircular coche ((pi/3) * 1 + t)
  <> caminoCircular coche ((pi/3) * 2 + t)
  <> caminoCircular coche ((pi/3) * 3 + t)
  <> caminoCircular coche ((pi/3) * 4 + t)
  <> caminoCircular coche ((pi/3) * 5 + t)
rueda :: Picture  
rueda =
     thickCircle 0.4 6
  <> rotated ((pi/6) * 0) radio
  <> rotated ((pi/6) * 1) radio
  <> rotated ((pi/6) * 2) radio
  <> rotated ((pi/6) * 3) radio
  <> rotated ((pi/6) * 4) radio
  <> rotated ((pi/6) * 5) radio
radio :: Picture
radio = solidRectangle 12 0.2
caminoCircular :: Picture -> Double -> Picture
caminoCircular d a =
  rotated a (translated 6 0 (rotated (-a) d))
coche :: Picture
coche =
     translated 0 (-0.5) (solidRectangle 0.2 1.2) 
  <> translated 0 (-1.2) (solidRectangle 1.6 0.8)Ejecución en Codeworld Noria
Comentario: Las funciones round, rem y fromInteger.
import CodeWorld
main :: IO ()
main = animationOf figura
figura :: Double -> Picture 
figura t = 
   scaled (2 * sin (t/10)) (2 * sin (t/10)) (rotated t ochoCuadrados)
ochoCuadrados::Picture
ochoCuadrados = 
   translated (-2) (-5) $
   pictures [ cuadrado
            , cuadrado'
            , translated (-2*a) (2*a) cuadrado
            , translated 0 4 cuadrado'
            , translated 0 (4*a) cuadrado
            , translated (2*a) (2*a) cuadrado
            , translated 4 0 cuadrado'
            , translated 4 4 cuadrado'
            ]
cuadrado:: Picture
cuadrado = translated 2 2 (rectangle 4 4)
a:: Double
a = sqrt 2
cuadrado':: Picture
cuadrado' = polygon [(0,0),(-2*a,2*a),(0,4*a),(2*a,2*a)]import CodeWorld
main :: IO ()
main = animationOf rotacionesTao
tao :: Picture
tao = pictures [ thickCircle 0.1 6
               , translated 0 (-3) (solidCircle 0.3)               
               , translated 0 (-3) (colored white (solidCircle 3))
               , translated 0 3 (colored white (solidCircle 0.3))               
               , translated 0 3 (solidCircle 3)               
               , semicirculo                 
               ]
               
semicirculo :: Picture
semicirculo = sector (-pi/2) (pi/2) 6
rotacionesTao :: Double -> Picture
rotacionesTao t = rotated t tao