Varios cuadrados encajados rotando
Enunciado
Definir la función
1 |
cuadrados :: Int -> Float -> Picture |
de forma que (cuadrados n) sea la animación obtenida rotando n cuadrados encajados como se muestra a continuación.
Nota: Escribir las soluciones usando la siguiente plantilla
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import Graphics.Gloss import System.IO main :: IO () main = do hSetBuffering stdout NoBuffering putStr "Introduce el numero de cuadrados [1..10]: " n <- readLn animate (InWindow (show n ++ " cuadrados encajados rotando" ) (600,600) (20,20)) white (cuadrados n) cuadrados :: Int -> Float -> Picture cuadrados n t = undefined |
Soluciones
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import Graphics.Gloss import System.IO main :: IO () main = do hSetBuffering stdout NoBuffering putStr "Introduce el numero de cuadrados [1..10]: " n <- readLn animate (InWindow (show n ++ " cuadrados encajados rotando" ) (600,600) (20,20)) white (cuadrados n) -- 1ª solución (por comprensión): cuadrados :: Int -> Float -> Picture cuadrados n t = pictures [rotate (6*(fromIntegral n)*t) $ scale (r^n) (r^n) $ rotate (g n) $ cuadrado | n <- [0..n-1]] where cuadrado = rectangleWire 400 400 g n | even n = 0 | otherwise = 45 r = 1 / sqrt 2 -- 2ª solución (por recursión): cuadrados2 :: Int -> Float -> Picture cuadrados2 1 _ = rectangleWire 500 500 cuadrados2 n t = pictures [rectangleWire 500 500, rotate (45+10*t) $ scale (1/sqrt 2) (1/sqrt 2) (cuadrados2 (n-1) t)] |