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 3
Ejecució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 3
Ejecución en CodeWorld/Haskell: Circunferencia2
circle :: Double -> Picture
drawingOf :: Picture -> IO ()
.circunferencia
y main
.CodeWorld
import CodeWorld
main :: IO ()
main = drawingOf circulo
circulo :: Picture
circulo = solidCircle 3
Ejecución en CodeWorld/Haskell: Circulo
Comentario: La función solidCircle :: Double -> Picture
.
import CodeWorld
main :: IO ()
main = drawingOf plano
plano :: Picture
plano = coordinatePlane
Ejecució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 3
Ejecució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 3
Ejecució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 3
Ejecució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 = polyline [(-3,3),(3,3),(-3,-3),(3,-3)]
Ejecución en Codeworld Camino
Comentario: La función polyline :: [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 <> coordinatePlane
Ejecució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 = closedCurve [(-4,8),(0,-8),(4,8)]
curvaConEjes :: Picture
curvaConEjes = curva <> coordinatePlane
Ejecución en CodeWorld/Haskell: Curva cerrada.
Comentario: La función closedCurve :: [Point] -> Picture
blank :: Picture
thickPolyline :: Double -> [Point] -> Picture`
thickPolygon :: Double -> [Point] -> Picture
solidPolygon :: [Point] -> Picture
thickCurve :: Double -> [Point] -> Picture
thickClosedCurve :: Double -> [Point] -> Picture
solidClosedCurve :: [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 circulo
Ejecució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) cuadrado
Ejecución en CodeWorld/Haskell: Cuadrado rotado.
rotated :: Double -> Picture -> Picture
pi :: Double
{-# LANGUAGE OverloadedStrings #-}
import CodeWorld
main :: IO ()
main = drawingOf textosEscalados
texto :: Picture
texto = lettering "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 cuadradoRojo
Ejecució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 <>
cuadradoVerde
Ejecució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 a = colored c (translated 0 a (solidCircle 1))
semaforo :: Picture
semaforo =
luz red 2.5 <>
luz yellow 0 <>
luz green (-2.5) <>
marco
import 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 (solidRectangle 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 yellow (solidCircle 7)
minutero :: Double -> Picture
minutero t = rotated (-(2*pi/3600)*t) (thickPolyline 0.1 [(0,0), (0,7)])
segundero :: Double -> Picture
segundero t = rotated (-(2*pi/60)*t) (polyline[(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 (light gray) (solidPolygon [(-8,-8),(0,-4),(8,-8)])
<> colored (light gray) (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
.