用于Clojure图像合成的DSL

mik*_*era 6 dsl clojure image-processing

我正在尝试在Clojure中创建一个用于图像合成的小型库/ DSL.基本上,这个想法是允许库的用户组合数学函数集以在程序上创建有趣的图像.

函数需要对double值进行操作,并采用将位置向量转换为颜色值的形式,例如(x,y,z) - >(r,g,b,a)

但是我面临一些有趣的设计决定:

  • 输入可能有1,2,3或甚至4维(x,y,z加时间)
  • 提供矢量数学运算(点积,加法,乘法等)会很好.
  • 用旋转,比例等操作组合函数是很有价值的.
  • 出于性能原因,重要的是始终使用原始双数学(即避免特别创建盒装双精度数).因此,需要返回红色,绿色和蓝色分量的函数可能需要成为三个独立的函数,它们分别返回原始的红色,绿色和蓝色值.

关于如何在Clojure(1.4 beta)中合理地实现这种DSL的任何想法?

mik*_*era 0

好的,所以我最终找到了一个很好的方法来做到这一点。

诀窍是将函数表示为代码向量(在“代码就是数据”的意义上,例如

[(Math/sin (* 10 x)) 
 (Math/cos (* 12 y)) 
 (Math/cos (+ (* 5 x) (* 8 y)))]
Run Code Online (Sandbox Code Playgroud)

然后可以通过以下方法“编译”以创建 3 个实现 Java 接口的对象:

public double calc(double x, double y, double z, double t) {
    .....
}
Run Code Online (Sandbox Code Playgroud)

可以使用原始值调用这些函数对象来获取每个像素的红色、绿色和蓝色颜色值。结果类似于:

在此输入图像描述

最后,可以使用简单的 DSL 来组合函数,例如放大纹理,您可以这样做:

(vscale 10 some-function-vector)
Run Code Online (Sandbox Code Playgroud)

我已经在 GitHub 上为感兴趣的人发布了所有代码:

https://github.com/micera/clisk