厳密な光線追跡 - その17 [光線追跡エンジンを作る]
前回は僕なりにMathematicaでオブジェクト指向なプログラムを考えてみた。今日はオブジェクトにしたくないオブジェクト(へんな言い方だけど)を考えてそのあと、具体的な実装を始める。
光線は波長や進行方向と言った内部状態を持っているけど、それを書き換える必要はほとんど無い。したがって光線はそういったいろいろな内部状態、属性を保持しているだけでいい。
そう言うオブジェクト、というかC++のようなクラスではない構造体に対応するものとしてcontainerというのを作っておく。
これは評価されずにただ引数を保持するためだけのシンボルで例えば光線の
こういうcontainerとしては
みたいなかんじかな。例えば面形状containerは固有のパラメータを保持する。平面containerにはパラメータはない。球面は曲率、2次曲面は曲率と円錐定数を保持する、というような感じ。
Mathematicaではパッケージと呼ばれる。Mathematicaのパッケージはライブラリとしての機能だけでなく、名前空間とそれを外部ファイルから読み込むメカニズムまで一体になっている。これはJavaのパッケージによく似ている、というかMathematicaのパッケージはMathematica1.0からあったはずなのでJavaより古い。僕はJavaがまねしたんだと思っている。
Mathematicaのいわゆるアドオンはすべてパッケージの形式になっていて、必要なときに読み込んで使うことになる。バージョンがあがるに従ってアドオンから組み込みになっていくものも多い。
自分で書いたMathematicaのコードも、再利用するならパッケージの形式にしておいたほうが便利になる。ところがMathematicaではコードを書いては計算して考えてまた書く、というやり方をすることが多くて再利用に向きにくい。しかしMathematicaは式の評価の結果がほかの評価に影響を受けるようなコードになりやすいこともあって、なんども実行するならパッケージにしておいた方がトラブルも少なくなる。
しかし、かなりMathematicaを使い込んでいる人であっても、自分の書いたコードをパッケージに整理する人はそれほど多くない。僕も昔はある程度まとまったコードができたら自分で継続的に使うためにパッケージにしていたが、最近はめっきりやらなくなってしまった。
このさいなので、Mathematicaのパッケージの書き方を整理しておこう。そのためにはまずコンテクストを理解しないといけない。
4.4.4 オブジェクトではないMathematicaシンボル
以上のようなやり方でオブジェクトを作ることにすると、すべてのオブジェクトには異なるシンボルが、すなわち名前が必要になる。媒質や面にそれぞれ名前があるのはいい、というかむしろあったほうがいいけど、例えば光線一本一本に全部名前を付けろ、と言われると面倒になる。光線は波長や進行方向と言った内部状態を持っているけど、それを書き換える必要はほとんど無い。したがって光線はそういったいろいろな内部状態、属性を保持しているだけでいい。
そう言うオブジェクト、というかC++のようなクラスではない構造体に対応するものとしてcontainerというのを作っておく。
これは評価されずにただ引数を保持するためだけのシンボルで例えば光線の
ray[startPosition : {xs_, ys_, zs_}, direction : {xd_, yd_, zd_}, vacuumWaveLength_, polarization_, intensity_]というようなもの。このrayというシンボルは光線であるということを表していて、その属性を保持して中身を評価しない。したがってrayというシンボルそのものにはなにも割り当てられないようにしておく。
こういうcontainerとしては
container | 内容 |
ray | 光線 |
(面形状) | |
planar | 平面 |
spharical | 球面 |
quadric | 2次曲面 |
aspherical | 非球面 |
parametric | 一般の媒介変数表示された曲面 |
(アパチャ形状) | |
circular | 円形 |
rectangular | 長方形 |
elliptic | 楕円 |
generic | 一般のアパチャ形状 |
5 具体的なMathematicaコード
5.1 Mathematicaパッケージ
いろいろなOSでフレームワークやライブラリなどといわれる、ある程度独立した機能をひとまとめにして開発時にヘッダを参照したり実行時にリンクして呼び出したりできるようになったものがある。例えばプログラマならたいていお世話になっているCの入出力ライブラリstdioなどを含んだlibcや、数値関数の集合であるmathライブラリのlibmなどである。Mathematicaではパッケージと呼ばれる。Mathematicaのパッケージはライブラリとしての機能だけでなく、名前空間とそれを外部ファイルから読み込むメカニズムまで一体になっている。これはJavaのパッケージによく似ている、というかMathematicaのパッケージはMathematica1.0からあったはずなのでJavaより古い。僕はJavaがまねしたんだと思っている。
Mathematicaのいわゆるアドオンはすべてパッケージの形式になっていて、必要なときに読み込んで使うことになる。バージョンがあがるに従ってアドオンから組み込みになっていくものも多い。
自分で書いたMathematicaのコードも、再利用するならパッケージの形式にしておいたほうが便利になる。ところがMathematicaではコードを書いては計算して考えてまた書く、というやり方をすることが多くて再利用に向きにくい。しかしMathematicaは式の評価の結果がほかの評価に影響を受けるようなコードになりやすいこともあって、なんども実行するならパッケージにしておいた方がトラブルも少なくなる。
しかし、かなりMathematicaを使い込んでいる人であっても、自分の書いたコードをパッケージに整理する人はそれほど多くない。僕も昔はある程度まとまったコードができたら自分で継続的に使うためにパッケージにしていたが、最近はめっきりやらなくなってしまった。
このさいなので、Mathematicaのパッケージの書き方を整理しておこう。そのためにはまずコンテクストを理解しないといけない。
2012-12-06 21:36
nice!(0)
コメント(0)
トラックバック(0)
コメント 0