6

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

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

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

  • 输入可能有 1、2、3 甚至 4 个维度(x、y、z 加上时间)
  • 最好提供向量数学运算(点积、加法、乘法等)
  • 将函数与诸如旋转、缩放等操作组合起来是很有价值的。
  • 出于性能原因,在整个过程中使用原始双精度数学非常重要(即,特别要避免创建盒装双精度)。所以一个需要返回红色、绿色和蓝色分量的函数可能需要成为三个独立的函数,分别返回原始的红色、绿色和蓝色值。

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

4

2 回答 2

1

看看很棒的 ImageMagick 工具http://www.imagemagick.org可以让您了解这样的库需要什么样的操作。

也许您会发现,如果您复制默认的 IM 工具集,您将不需要下拉到矢量数学。

于 2012-05-19T06:03:55.383 回答
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) {
    .....
}

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

在此处输入图像描述

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

(vscale 10 some-function-vector)

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

https://github.com/mikera/clisk

于 2012-05-20T10:19:08.120 回答