厳密な光線追跡 - その15 [光線追跡エンジンを作る]
前回、光線追跡エンジンの大まかなオブジェクト設計をした。比較的簡単で素直にできた。その中で、中間的なオブジェクトやお互い保持し合うオブジェクトがある。もう一度整理をかねてまとめておく。最近この程度でもすぐわからなくなってしまう。思考力の老化はひたひたと。おおぉ、自分で書いときながらむちゃ、怖いわ。
厳密な光線追跡 - その14 [光線追跡エンジンを作る]
前回からMathematicaに実装する光線追跡エンジンのおおまかなオブジェクト設計を始めた。あまりCodeVやZemaxなんかの概念を引きずらないで、プログラミングのしやすさを前提に考えることにした。
というかまあ、そういう姿勢はいつもの通りで、自分のやり方に素直なほうがきれいに書けるし、とちゅうでいやになりにくい。もちろんそういうやりかたが失敗することもよくあるけど。
というかまあ、そういう姿勢はいつもの通りで、自分のやり方に素直なほうがきれいに書けるし、とちゅうでいやになりにくい。もちろんそういうやりかたが失敗することもよくあるけど。
厳密な光線追跡 - その13 [光線追跡エンジンを作る]
うわ、続いてる。僕にしては快挙。スタック深さ2を超えた。
まあ、それはいいとして、Mathematicaに書いた光線追跡エンジンはとっくに動いてるんだけど、ここで公開するのにはためらいがあった。なぜかというと、コードがあまりきれいではないのと、非球面の光線追跡がとんでもなく遅い、というのが原因。
なんで非球面の追跡が遅いか、というと光線が一本与えられるたびに非球面係数から具体的な非球面式を作ってそれからその微係数も作って、ということをしているせい。当然、係数が与えられたらその具体的な式はどこかに保存しておいて、追跡の時はそれを参照すれば速くなる。しかしそのためには係数の組と式とをまとめて保存するしくみが必要。しかしMathematicaを使う時は、式は複雑になるけど独立した要素はそれほど多くないのが普通で、今回のように考慮しなければいけない要素が増えてくるとMathematicaでもちゃんとオブジェクト設計をしないといけない。それを怠って前回書いた式をそのままMathematicaで評価するようなコードを書いていた。
Mathematicaでも独立した要素が多い場合、オブジェクト指向な考え方を使った書き方をすべきである。ということで、全部チャラにして書き直すことにする。まず、光線追跡エンジンのためにはどういう風にオブジェクトを考えればいいか、ということから始める。
まあ、それはいいとして、Mathematicaに書いた光線追跡エンジンはとっくに動いてるんだけど、ここで公開するのにはためらいがあった。なぜかというと、コードがあまりきれいではないのと、非球面の光線追跡がとんでもなく遅い、というのが原因。
なんで非球面の追跡が遅いか、というと光線が一本与えられるたびに非球面係数から具体的な非球面式を作ってそれからその微係数も作って、ということをしているせい。当然、係数が与えられたらその具体的な式はどこかに保存しておいて、追跡の時はそれを参照すれば速くなる。しかしそのためには係数の組と式とをまとめて保存するしくみが必要。しかしMathematicaを使う時は、式は複雑になるけど独立した要素はそれほど多くないのが普通で、今回のように考慮しなければいけない要素が増えてくるとMathematicaでもちゃんとオブジェクト設計をしないといけない。それを怠って前回書いた式をそのままMathematicaで評価するようなコードを書いていた。
Mathematicaでも独立した要素が多い場合、オブジェクト指向な考え方を使った書き方をすべきである。ということで、全部チャラにして書き直すことにする。まず、光線追跡エンジンのためにはどういう風にオブジェクトを考えればいいか、ということから始める。
厳密な光線追跡 - その9 [光線追跡エンジンを作る]
前回一般的な姿勢の面と光線との交点を求める問題を、光線を逆方向に姿勢を変換して一番簡単な面の姿勢での問題にすることを提案した。一般の2次曲面や非球面はこうしないと解くのが難しいが、平面球面にとっては計算効率的には完全に不利。しかし統一的に扱うことができて簡単になる。
今日は光線追跡の眼目、屈折光線の計算について。成分にわけないベクトル表現のままの屈折の定式化は一般化しやすいので便利。
今日は光線追跡の眼目、屈折光線の計算について。成分にわけないベクトル表現のままの屈折の定式化は一般化しやすいので便利。
厳密な光線追跡 - その7 [光線追跡エンジンを作る]
前回までで光学に出てくる面形状に光線が入射するとき、その光線と面との交点を求めた。解が解析的に書けると繰り返しの収束演算をする必要がなくて速い。また収束演算が必要な場合でも、解析解を初期値に使えるような面形状だと収束は速いし、収束も安定になることが期待できる。
今日はちょっと横道にそれるけど、それにまつわる数値計算精度の話。
先に言っておくけど、僕はここで「精度が低下するぞ、恐ろしいぞ」と脅かすつもりはない。若い人はどんどんいろんなことをやって痛い目にあえばいい。それが勉強だし僕も痛い目にあってきた。僕が言いたいのは、光学の大家に相談したとき「自由度が足りないなら奇数次を入れれば?」と言われてえらい人の言うことだから、と思考停止的に鵜呑みにするのは危険である、ということ。
光学は古い分野で年寄りがいつまでものさばっている、と僕は思っている。僕が若い人に伝えたいのは、年寄りが「奇数次」と言ったときに、ちょっと待てよ、と思ってほしいということである。
今日はちょっと横道にそれるけど、それにまつわる数値計算精度の話。
先に言っておくけど、僕はここで「精度が低下するぞ、恐ろしいぞ」と脅かすつもりはない。若い人はどんどんいろんなことをやって痛い目にあえばいい。それが勉強だし僕も痛い目にあってきた。僕が言いたいのは、光学の大家に相談したとき「自由度が足りないなら奇数次を入れれば?」と言われてえらい人の言うことだから、と思考停止的に鵜呑みにするのは危険である、ということ。
光学は古い分野で年寄りがいつまでものさばっている、と僕は思っている。僕が若い人に伝えたいのは、年寄りが「奇数次」と言ったときに、ちょっと待てよ、と思ってほしいということである。
厳密な光線追跡 - その6 [光線追跡エンジンを作る]
前回、球面と光線との交点を求める式を導いた。面白い形に整理できて、この形を他所で見たことがないんだけど、これってあたりまえなの?あんまり当たり前のことを書いてもしかたない。
まあとりあえずいいとして、今日は球面の延長としての2次曲面の交点を求める問題を整理して、そのあと非球面の場合をちょこっと考察する。非球面はいろいろ問題が多いので次回にまたがることになる。
まあとりあえずいいとして、今日は球面の延長としての2次曲面の交点を求める問題を整理して、そのあと非球面の場合をちょこっと考察する。非球面はいろいろ問題が多いので次回にまたがることになる。