2009-06-25[n年前へ]
■Mathematicaで発色シミュレーションをオブジェクト風記述にするライブラリ
以前作った、「分光スペクトル・色処理用のMathematicaライブラリ(関数群)」を利用して、「Mathematicaで発色シミュレーションをオブジェクト風記述にするライブラリ」を作りました。前回書いたように、三次元構造の中で反射・屈折・散乱を行う「光」のスペクトルが、どのように変化していったかを知ることができます。
ライブラリは、Imagearts.2.5.nb(3.7MB)として、サイト上にアップロードしてあります。このファイルには、関数・オブジェクト定義に加え、いくつかのサンプルが入っています。
たとえば、「4層構成の物質(Layer)があり、それらの層はすべて透明だけれども、その中間層2層の散乱度合いを変えた場合」のシミュレーションを複数条件下でしたければ、下記のようなコードを書けばOKということになります。
layers[sc_] := (z = #[[3]]; Piecewise[{
{{1, 0,Spector[new][set,transparentFilter]},
z > 1},
{{1, sc,Spector[new][set, transparentFilter]},
1 >= z && z > 0.5},
{{1, sc,Spector[new][set, transparentFilter]},
0.5 >= z && z > 0},
{{1, 0,Spector[new][set, transparentFilter]},
0 >= z} } ]) &;
Table[Light[new][in,Layer[new][set,layers[i]]][showTrace],
{i,0,1,0.1}]
ここでは、最初に層構成を純関数として定義し、その純関数を使い、条件を変えたオブジェクトをTableで作成し・計算を行っています。
なお、現状のライブラリは、表面形状は水平平滑に限る、という単純なコードになっています。表面凹凸対応は、また気が向いた(近い)時期にしてみよう、と思います。
2009-10-26[n年前へ]
■「エクセル」と「無名関数」
ふと、エクセルほど無名関数(Mathematicaでいうところの純関数)を使っている開発環境はないのではな
いか、と考えた(妄想ともいう)。もちろん、エクセルでも関数を定義したり、記述式を定義したりすることができる。しかし、実際にエクセルを使う状況を考えてみれば、「セルに処理を書き入れ(まく)り」「その処理記述に名前を付けたりはしないまま・コピペしまくり、使い回す」ことが多いと思う。これは、「エクセルが配列ベースの無名関数志向開発環境だ」と言えるのではないか、などと考えてみたのである。
たまに、Rubyでデータ処理し、その結果をエクセルで眺めることがある。そんな時、Rubyとエクセルの組み合せワザのようなことをすることもある。それは、たとえば、こんな具合のコードだ。
d=[]
10.times{d<<'=2*RC[1]'}
d<<ARGV[0]
puts d.join(',')
'=2*RC[1]'の部分は、エクセルの関数である。そして、それ以外の部分はRubyの関数だ。RC[1]は「自分の右のセル」を指すので、次(右)のセルの2倍という関数である。たいていのデータは、左から右(あるいは上から下)に読み込んでいくので、この例の場合、次(未来)の値を使って演算をしていることが面白い、と感じたりする。それでは、このRubyスクリプトをm.rbと名付け、
ruby m.rb > m.csvとして、m.csvを作成する。そして、そのcsvファイルを(セル表示名ををR1C1形式にした)エクセルで開くとデータ列ができあがる、ということになる。上の例であれば、下のような数値が入ったエクセルシートができあがる。
512 256 128 64 32 16 8 4 2 1
この例のような、複数言語を組み合わせた「闇鍋(やみなべ)ごった煮プログラミング」を上手く活用することはできないだろうか。…そういうことをよく考えるのだけれど、なかなか良いアイデアが思いつかない。何か、面白い位置づけ・適切な使い方がないものだろうか。

