2012-05-15 14 views
6

Estoy experimentando con la creación de una pequeña biblioteca/DSL para la síntesis de imágenes en Clojure. Básicamente, la idea es permitir que los usuarios de la biblioteca compongan conjuntos de funciones matemáticas para crear imágenes interesantes de manera procesal.DSL para la síntesis de imágenes Clojure

Las funciones deben operar en valores dobles, y tomar la forma de convertir un vector de ubicación en un valor de color, p. (X, y, z) -> (r, g, b, a)

Sin embargo estoy frente a algunas decisiones de diseño interesante:

  • entradas podrían tener 1,2,3 o incluso 4 dimensiones (x, y, z más tiempo)
  • Sería bueno proporcionar operaciones vectoriales de matemáticas (productos de puntos, suma, multiplicación, etc.)
  • Sería valioso componer funciones con operaciones tales como rotar, escalar etc.
  • Por razones de rendimiento, es importante utilizar matemáticas dobles primitivas en todas partes (es decir, evitar crear d oubles en particular). De modo que una función que necesite devolver componentes rojo, verde y azul tal vez necesite convertirse en tres funciones separadas que devuelven los valores primitivos rojo, verde y azul, respectivamente.

¿Alguna idea sobre cómo este tipo de DSL se puede lograr razonablemente en Clojure (1.4 beta)?

+0

consiguió cualquier proyecto de primeras piezas de arriba en GitHub? – rplevy

+0

https://github.com/mikera/clisk – mikera

+0

conoces pan (y mi pancito, que era una copia pura de haskell). esa fue una biblioteca basada en Haskell que hizo justamente esto. probablemente puedas buscar información en google. podría darte algunas ideas. [...] http: // conal.net/Pan/(si esperas generar algo hermoso, no te desanimes, todavía estoy sorprendido de cómo logró generar esas feas imágenes de una biblioteca tan poderosa). ps pancito también http://www.acooke.org/pancito-code/ –

Respuesta

0

OK, así que finalmente descubrí una buena manera de hacerlo.

El truco era representar funciona como un vector de código (en el "es código de datos" sentido, por ejemplo

[(Math/sin (* 10 x)) 
(Math/cos (* 12 y)) 
(Math/cos (+ (* 5 x) (* 8 y)))] 

Esto puede ser "compilado" para crear 3 objetos que implementan una interfaz Java con el siguiente método:.

public double calc(double x, double y, double z, double t) { 
    ..... 
} 

y estos objetos de función se pueden llamar con valores primitivos para obtener los valores de color azul para cada píxel rojo, verde y resultados son algo así como:

enter image description here

Finalmente, es posible componer las funciones usando una DSL simple, p. para ampliar una textura que puede hacer:

(vscale 10 some-function-vector) 

He publicado todo el código en GitHub para cualquier persona interesada:

https://github.com/mikera/clisk

+1

Podrías hacer que genere el código "fuente" de Piet y usarlo como un compilador cruzado generativo;) –

1

Un vistazo a las asombrosas herramientas de ImageMagick http://www.imagemagick.org puede darle una idea de qué tipo de operaciones se esperaría de dicha biblioteca.

Tal vez veas que no necesitarás desplegar en vectores matemáticos si duplicas el conjunto de herramientas IM predeterminado.