2012-05-15 11 views
6

Clojureで画像合成用の小さなライブラリ/ DSLを作成してみました。基本的には、図書館のユーザーが一連の数学関数を作成して、手続き的に面白い画像を作成できるようにすることです。DSL for Clojure画像合成

この関数は、double値で操作する必要があり、位置ベクトルを色値に変換する形式をとります。 (X、Y、Z) - >(R、G、B、A)私はいくつかの興味深い設計上の決定に直面していますが

  • 入力は多分1,2,3またはを持つことができます4次元(x、y、z +時間)
  • ベクトル演算(ドット積、加算、乗算など)を提供するのがよいでしょう。
  • 回転、スケールなどの操作で関数を作成することは有益でしょう
  • パフォーマンス上の理由から、原始的な二項演算を使用することが重要です(つまり、ボックス化されたd特にoubles)。したがって、赤、緑、青のコンポーネントを返す必要がある関数は、おそらくそれぞれプリミティブな赤、緑、青の値を返す3つの別々の関数になる必要があります。

この種のDSLがClojure(1.4ベータ版)でどのように合理的に達成できるかについてのアイデアはありますか?

+0

はgithubの上までそれの任意の早期ドラフト片を手に入れたあなたが行うことができますテクスチャをスケールアップするには? – rplevy

+0

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

+0

あなたはパン(と私のパンチ、純粋なhaskellコピーだった)を知っていますか?これはちょうどこれをしたhaskellベースのライブラリでした。あなたはおそらくいくつかの情報をgoogleすることができます。それはあなたにいくつかのアイデアを与えるかもしれない。 [...] http:// conal。net/Pan /(あなたが美しいものを作りたいと思っているなら、落胆しないでください - そのような強力な図書館からこのような醜いイメージを生成するためにconalがいかに管理されたか驚いています)。 ps pancito too http://www.acooke.org/pancito-code/ –

答えて

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) { 
    ..... 
} 

そして、これらの関数オブジェクトは、各画素ごとに赤、緑、青の色の値を取得するために、プリミティブ値で呼び出すことができます。結果はのようなものです:。

enter image description here

最後に、単純なDSLを使用して関数を構成することができます。私が興味のある人のためのGitHub上のすべてのコードを公開した

(vscale 10 some-function-vector) 

https://github.com/mikera/clisk

+1

Pietの "ソース"コードを生成し、それを生成クロスコンパイラを使用することができます;) –

1

素晴らしいImageMagickツールhttp://www.imagemagick.orgを見ると、そのようなライブラリから期待される操作の種類を知ることができます。

デフォルトのIMツールセットを複製する場合、ベクトル演算にドロップする必要はないことがわかります。

関連する問題