2012-05-15 1 views
6

Я экспериментирую с созданием небольшой библиотеки/DSL для синтеза изображений в Clojure. В принципе, идея состоит в том, чтобы позволить пользователям библиотеки составлять наборы математических функций для процедурного создания интересных изображений.DSL для синтеза изображений Clojure

Функции должны работать с двойными значениями и принимать форму преобразования вектора местоположения в значение цвета, например. (Х, у, г) -> (г, г, б, а)

Однако я столкнулся несколько интересных дизайнерских решений:

  • Входы могут иметь 1,2,3 или, возможно, даже 4 измерения (x, y, z плюс время)
  • Было бы полезно предоставить векторные математические операции (точечные произведения, сложение, умножение и т. Д.)
  • Было бы полезно составлять функции с такими операциями, как вращение, масштабирование и т. д.
  • По соображениям производительности важно использовать примитивные двойные математические схемы (т.е. избегать создания в штучной упаковке d в частности). Таким образом, функция, которая должна возвращать красные, зеленые и синие компоненты, возможно, должна стать тремя отдельными функциями, которые возвращают примитивные красные, зеленые и синие значения соответственно.

Любые идеи относительно того, как этот вид DSL можно разумно достичь в Clojure (1.4 beta)?

+0

Got любые ранние проекты части его на GitHub? – rplevy

+0

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

+0

Вы знаете панораму (и мой pancito, который был копией чистого-haskell). это была библиотека на основе haskell, которая сделала именно это. вы, вероятно, можете добавить некоторую информацию в Google. это может дать вам некоторые идеи. [...] http: // conal.net/Pan/(если вы надеетесь создать что-то красивое, не отчаивайтесь - я все еще удивляюсь, как коналю удалось создать такие уродливые образы из такой мощной библиотеки). ps pancito too http://www.acooke.org/pancito-code/ –

ответ

0

ОК, поэтому я в конце концов понял хороший способ сделать это.

Хитрость в том, чтобы представлять функции в качестве вектора кода (в «код является данных» смысле, например

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

Это может затем быть «составлен», чтобы создать 3 объекты, которые реализуют интерфейс Java с следующий метод:.

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

и эти функциональные объекты могут быть вызваны с примитивными значениями, чтобы получить красный, зеленый и синий цветовые значения для каждого пикселя результаты являются чем-то вроде:

enter image description here

Наконец, можно скомпоновать функции, используя простую DSL, например. наращивать текстуру вы можете сделать:

(vscale 10 some-function-vector) 

Я опубликован весь код на GitHub для всех, кто интересуется:

https://github.com/mikera/clisk

+1

Вы можете заставить его сгенерировать Piet «исходный» код и использовать его генеративный кросс-компилятор;) –

1

Взгляд на удивительные инструменты ImageMagick http://www.imagemagick.org может дать вам представление о том, какие операции можно ожидать от такой библиотеки.

Возможно, вы увидите, что вам не нужно будет сбрасывать векторную математику, если вы реплицируете набор инструментов IM по умолчанию.