Programas, funciones y dibujos

1 Introducción

2 Dibujos elementales

2.1 Dibujo de circunferencias

import CodeWorld

main = drawingOf circunferencia

circunferencia = circle 3
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

2.2 Dibujo de círculos

import CodeWorld

main :: IO ()
main = drawingOf circulo

circulo :: Picture
circulo = solidCircle 3

2.3 Dibujo del plano de coordenas

import CodeWorld

main :: IO ()
main = drawingOf plano

plano :: Picture
plano = coordinatePlane

2.4 Dibujo de rectángulos

import CodeWorld

main :: IO ()
main = drawingOf rectangulo

rectangulo :: Picture
rectangulo = rectangle 6 3
import CodeWorld

main :: IO ()
main = drawingOf rectangulo

rectangulo :: Picture
rectangulo = thickRectangle 0.5 6 3
import CodeWorld

main :: IO ()
main = drawingOf areaRectangular

areaRectangular :: Picture
areaRectangular = solidRectangle 6 3

2.5 Dibujo de caminos

import CodeWorld

main :: IO ()
main = drawingOf camino

camino :: Picture
camino = polyline [(-3,3),(3,3),(-3,-3),(3,-3)]

2.6 Dibujo de polígonos

import CodeWorld

main :: IO ()
main = drawingOf triangulo

triangulo :: Picture
triangulo = polygon [(-9,-9),(0,9),(9,-9)]

2.7 Dibujo de curvas

import CodeWorld

main :: IO ()
main = drawingOf curvaConEjes

curva :: Picture
curva = curve [(-4,8),(0,-8),(4,8)]

curvaConEjes :: Picture
curvaConEjes = curva <> coordinatePlane
import CodeWorld

main :: IO ()
main = drawingOf curvaConEjes

curva :: Picture
curva = closedCurve [(-4,8),(0,-8),(4,8)]

curvaConEjes :: Picture
curvaConEjes = curva <> coordinatePlane

2.8 Otros dibujos elementales

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

3 Dibujos compuestos

3.1 Dibujos con dos dibujos

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)]

3.2 Dibujos con varios dibujos

import CodeWorld

main :: IO ()
main = drawingOf tresCircunferencias

tresCircunferencias :: Picture
tresCircunferencias = pictures [circle 2, circle 4, circle 6]

4 Transformaciones de dibujos

4.1 Traslaciones

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

4.2 Rotaciones

import CodeWorld

main :: IO ()
main = drawingOf cuadradoRotado 

cuadrado :: Picture
cuadrado = rectangle 6 6

cuadradoRotado :: Picture
cuadradoRotado = rotated (pi/4) cuadrado

4.3 Escalamiento

{-# 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) 

4.4 Coloreado

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
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

5 Programación de dibujos

5.1 Dibujo de un semáforo

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

5.2 Dibujo de una bandera

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)

6 Animaciones de dibujos

6.1 Rotando un cuadrado

import CodeWorld

main :: IO ()
main = animationOf cuadrado 

cuadrado :: Double -> Picture
cuadrado t = rotated t (colored red (solidRectangle 7 7))

6.2 Transladando un círculo

import CodeWorld

main :: IO ()
main = animationOf circulo

circulo :: Double -> Picture
circulo t = translated (9*sin(t-9)) 0 (colored red (solidCircle 1))

6.3 Expandiendo un círculo

import CodeWorld

main :: IO ()
main = animationOf circulo

circulo :: Double -> Picture
circulo t = colored red (solidCircle (8 * sin t))

6.4 Simulación de un reloj

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)])

6.5 Simulación de una noria de feria

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)


Universidad de Sevilla

José A. Alonso Jiménez
Grupo de Lógica Computacional
Dpto. de Ciencias de la Computación e I.A.
Universidad de Sevilla