6

Clojure で画像合成用の小さなライブラリ/DSL を作成しようとしています。基本的には、ライブラリのユーザーが一連の数学関数を構成して、興味深い画像を手続き的に作成できるようにするという考え方です。

関数は double 値を操作する必要があり、(x,y,z) - > (r,g,b,a) など、位置ベクトルをカラー値に変換する形式を取る必要があります。

ただし、いくつかの興味深い設計上の決定に直面しています。

  • 入力は 1、2、3、または 4 次元 (x、y、z と時間) を持つことができます。
  • ベクトル演算 (ドット積、加算、乗算など) を提供するとよいでしょう。
  • 回転、拡大縮小などの操作で関数を構成することは価値があります。
  • パフォーマンス上の理由から、プリミティブ double 演算を全体で使用することが重要です (つまり、特に boxed double を作成しないでください)。したがって、赤、緑、青のコンポーネントを返す必要がある関数は、おそらく赤、緑、青のプリミティブ値をそれぞれ返す 3 つの別個の関数にする必要があります。

この種の DSL を Clojure (1.4 ベータ版) で合理的に実現する方法についてのアイデアはありますか?

4

2 に答える 2

1

すばらしい ImageMagick ツールhttp://www.imagemagick.orgを見ると、そのようなライブラリからどのような操作が期待されるかがわかります。

デフォルトの IM ツールセットを複製すれば、ベクトル演算にドロップダウンする必要がないことがわかるでしょう。

于 2012-05-19T06:03:55.383 に答える
0

OK、それで私は最終的にこれを行うための良い方法を見つけました。

秘訣は、関数をコードのベクトルとして表現することでした(「コードはデータ」の意味で、たとえば

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

次に、これを「コンパイル」して、次のメソッドでJavaインターフェースを実装する3つのオブジェクトを作成できます。

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 に答える