0votos

Dibujar estrellas en ASCII en Haskell

por josejuan hace 6 años

Misma estrategia que seguí en "Dibujar un triángulo".

Escribir una función que dibuje estrellas en ASCII.

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
29
30
31
32
33
34
-- Las coordenadas de los 'n' vértices de una estrella de radio 'r' 
starPoints r n = [(c i cos, c i sin) | i <- [1..n]] 
  where c i f = round (r * f (2 * i * pi / n)) 
 
-- Las coordenadas (inicio, fin) de las 'n' aristas de una estrella de radio 'r' 
--     tomando los vértices cada 's' 
starLines n s r = concat [drawLine (p!!i) (p!!(i + s)) | i <- [1..n]] 
  where p = cycle $ starPoints r $ fromIntegral n 
 
 
 
 
 
-- Esta función escribe en un framebuffer los píxeles que se indican 
drawPixels ps = [[ if (x, y) `elem` ps then 'X' else ' ' | x <- [minimum cx..maximum cx]] | y <- [minimum cy..maximum cy]] 
  where cy = map snd ps 
        cx = map fst ps 
 
 
-- Esta función, obtiene los píxeles que forman parte de una recta 
drawLine (x1, y1) (x2, y2) = 
  if abs dx >= abs dy 
    then 
      if x1 <= x2 
        then [(x, y1 + ((x - x1) * dy) `div` dx) | x <- [x1..x2]] 
        else drawLine (x2, y2) (x1, y1) 
    else 
      map (\(x, y) -> (y, x)) $ drawLine (y1, x1) (y2, x2) 
  where dx = x2 - x1 
        dy = y2 - y1 
 
 
-- Esta función imprime una estrella 
printStar n s r = putStrLn . unlines . drawPixels $ starLines n s r 

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.