Fractal hexagonal
Escribir, usando CodeWorld, un programa para dibujar el fractal hexagonal que se muestra en la siguiente animación
Las 4 primeras fases de la animación son
Nota: Este ejercicio ha sido propuesto por Agustín Martín Aguera.
Escribir, usando CodeWorld, un programa para dibujar el fractal hexagonal que se muestra en la siguiente animación
Las 4 primeras fases de la animación son
Nota: Este ejercicio ha sido propuesto por Agustín Martín Aguera.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import CodeWorld main :: IO() main = animationOf (hexagono . s) hexagono :: Int -> Picture hexagono 0 = colored red $ solidPolygon [(9,0),(4.5,c),(-4.5,c),(-9,0),(-4.5,-c),(4.5,-c)] where c = 9 * sin (pi / 3) hexagono n = pictures (hex : take 6 (iterate (rotated (pi / 3)) (translated 6 0 hex))) where hex = scaled (1/3) (1/3) $ hexagono (n-1) s :: Double -> Int s t = mod (floor t) 5 |
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 |
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)] |
Definir la función
1 |
cuadrados :: Int -> Picture |
tal que (cuadrados n) dibuje n cuadrados encajados como se muestra en las siguientes figuras:
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 display (InWindow (show n ++ " cuadrados encajados" ) (600,600) (20,20)) white (cuadrados n) cuadrados :: Int -> Picture cuadrados n = undefined |
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 |
import Graphics.Gloss import System.IO main :: IO () main = do hSetBuffering stdout NoBuffering putStr "Introduce el numero de cuadrados [1..10]: " n <- readLn display (InWindow (show n ++ " cuadrados encajados" ) (600,600) (20,20)) white (cuadrados n) -- 1ª solución (por comprensión): cuadrados :: Int -> Picture cuadrados n = pictures [scale (r^n) (r^n) $ rotate (g n) $ cuadrado | n <- [0..n-1]] where cuadrado = rectangleWire 500 500 g n | even n = 0 | otherwise = 45 r = 1 / sqrt 2 -- 2ª solución (por recursión): cuadrados2 :: Int -> Picture cuadrados2 1 = rectangleWire 500 500 cuadrados2 n = pictures [rectangleWire 500 500, rotate 45 $ scale (1/sqrt 2) (1/sqrt 2) (cuadrados2 (n-1))] |