1votos

Dibujar curva del dragón. en Haskell

por josejuan hace 8 meses

.

Se debe dibujar la curva del dragón dado un nivel n. El "dibujo" puede ser entregado como quieran, ya sea en alguna interfaz, en el terminal o incluso entregar un archivo escrito.

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
35
36
37
38
import Data.List (intersperse) 
 
k = √2 × cos (π/4) / 2 
 
rot (ax, ay) (bx, by) = (ax + k × (bx - ax - by + ay), ay + k × (bx - ax + by - ay)) 
 
grow r (u:v:xs) = u: r u v: grow (flip r) (v:xs) 
grow _      xs  = xs 
 
-- genera un dragón sobre el vector indicado de n niveles 
dragon a b n = head $ drop n $ iterate (grow rot) [a, b] 
 
 
 
 
 
 
-- una forma cómoda de renderizar 
svg :: [(𝔻, 𝔻)] → 𝐒 
svg xs = 
  let minx = minimum $ map fst xs 
      maxx = maximum $ map fst xs 
      miny = minimum $ map snd xs 
      maxy = maximum $ map snd xs 
  in  "<svg width=\"" ⧺ show (maxx - minx) ⧺ "\" height=\"" ⧺ show (maxy - miny) ⧺ "\" xmlns=\"http://www.w3.org/2000/svg\">" 
    ⧺ "<polyline fill=\"none\" stroke=\"black\" " 
    ⧺      "points=\"" ⧺ concat (intersperse " " [show (x - minx) ⧺ "," ⧺ show (y - miny) | (x, y) ← xs]) ⧺ "\"/>" 
    ⧺ "</svg>" 
     
 
{- 
 
-- por ejemplo 
> writeFile "/home/josejuan/tmp/z.svg" $ svg $ dragon (0,0) (850,0) 15 
 
(genera un dragón como éste https://bentrubewriter.files.wordpress.com/2012/04/dragon16.png ) 
 
-} 
7 comentarios
0votos

Escrito por AverageUser hace 8 meses

Una pregunta nada que ver con el problema. ¿Con que mides los tiempos de tus funciones? (en Haskell obvio)
0votos

Escrito por AverageUser hace 8 meses

también me preguntaba si me podrías pasar tu configuración de conceal.
1votos

Escrito por josejuan hace 8 meses

Para `conceal` en `vim` uso https://github.com/dag/vim2hs y https://github.com/enomsg/vim-haskellConcealPlus ya te advierto que usar `conceal` es un poco incómodo al principio porque las tabulaciones de `vim` quedan "ocultas". A mi me gusta usarlo porque me encanta como queda el código con símbolos, pero si no te dicen mucho es mejor no usar `conceal`.
0votos

Escrito por AverageUser hace 8 meses

En realidad no uso vim, uso Atom pero tambien me sirve , gracias.
0votos

Escrito por josejuan hace 8 meses

Hola @Average-user, en `ghci` suelo medir los tiempos con `:set +s` y en línea de comandos con `time` (linux), muy rara vez mido tiempos concretos de funciones concretas.
0votos

Escrito por AverageUser hace 8 meses

Hola, tenia ganas de probar el Snake que pusiste como solución en tu propio problema, se que fue hace mucho, pero de ser posible, me gustaría obtener las fotos, los links que das ya no funcionan.
0votos

Escrito por josejuan hace 8 meses

Hola @Average-user, lo acabo de compilar y va bien, los comandos son:
$ stack new snake
$ wget 'https://gist.github.com/3228724' -O snake/app/Main.hs

Luego editas `snake/snake.cabal` y lo dejas como:
name:                snake
version:             0.1.0.0
synopsis:            Initial project template from stack
description:         Please see README.md
homepage:            https://github.com/githubuser/snake#readme
license:             BSD3
license-file:        LICENSE
author:              Author name here
maintainer:          example@example.com
copyright:           2016 Author name here
category:            Web
build-type:          Simple
-- extra-source-files:
cabal-version:       >=1.10

executable snake-exe
  hs-source-dirs:      app
  main-is:             Main.hs
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
  build-depends:       base
                     , SDL
                     , SDL-image
                     , random
  default-language:    Haskell2010

En el archivo `stack.yaml` cambias la línea para dejarla como:
...
# Dependency packages to be pulled from upstream that are not in the resolver
# (e.g., acme-missiles-0.3)
extra-deps:
- SDL-0.6.5.1
- SDL-image-0.6.1.2
...

Te bajas unas imágenes (preferiblemente PNG) que sean una rana `frog.png` una cabeza de serpiente `head.png` y el cuerpo de serpiente `body.png` y ya puedes ejecutarlo (pon bolas de colores y ya, lo primero que pilles en google):
$ cd snake
$ wget 'http:/...' -O frog.png
$ wget 'http:/...' -O head.png
$ wget 'http:/...' -O body.png
$ stack runghc app/Main.hs

¡Listo! ;)

Comenta la solución

Tienes que identificarte para poder publicar tu comentario.