近軸光線追跡 - その8 [近軸光線追跡]
前回近軸マトリクスの計算をMathematicaでやるための設計をした。と、いうほどたいした内部構造はもっていない。今日はその構造を使って計算結果を出力する関数の形式を考えることにする。
などを作った。これはtotalThickness以外はどれも
また、共役同士のあいだで決まる共役位置、横倍率、角倍率、縦倍率はbuildParaxialSystemを呼んだときに設定した物体距離と像面距離が使われる。つまり、
buildParaxialSystemを呼んだときにl0とlkに数値ではなく、シンボルを与えてあれば式のまま返されるので後から数値評価できる。
あまり美しくないけど、大きな値を指定しておくよりはスマートだと思う。
drawParaxialSystemは描画にParametricPlotあるいはParametricPlot3Dを使っている。drawParaxialSystemのオプションにはsection2DではParametricPlotの、それ以外ではParametricPlot3Dのオプションを指定できる。
その他のオプションとして
こういうの式のまま計算できるのはMathematicaを使うメリット。
また、
次回はもうちょっと面白そうな結果を示そう。
6.3 近軸諸量の計算
近軸量の計算はtotalThickness | レンズ全厚 |
focalPoint | 焦点位置 |
principalPoint | 主点位置 |
nodalPoint | 節点位置 |
conjugatePoint | 共役位置 |
lateralMagnification | 横倍率 |
angularMaginification | 角倍率 |
longitudinalMagnification | 縦倍率 |
focalPoint[sys, imageSpace] focalPoint[sys, objectSpace]2種類ある。それぞれ像側と物体側の値で、像側は最終面から、物体側は第1面からの距離になる。第2引数を省略すると像側と解釈される。
また、共役同士のあいだで決まる共役位置、横倍率、角倍率、縦倍率はbuildParaxialSystemを呼んだときに設定した物体距離と像面距離が使われる。つまり、
lateralMagnification[sys, imageSpace]とすると、物体位置l0と共役な像位置との横倍率が計算される。そのときlkは無視される。逆に
lateralMagnification[sys, objectSpace]とすれば、像位置lkと共役な物体位置との横倍率になる。ただしその値は物体側から像側への倍率である。
buildParaxialSystemを呼んだときにl0とlkに数値ではなく、シンボルを与えてあれば式のまま返されるので後から数値評価できる。
6.4 無限遠の扱い
無限遠専用のシンボルとしてinfinityDistanceを用意する。これは無評価のまま残される。そのまま近軸量を計算すると結果に残る。数値評価したい場合
resolveInfinity[conjugatePoint[gauss]]とすれば、この関数の内部で
Limit[conjugatePoint[gauss], infinityDistance->Infinity]として評価される。
あまり美しくないけど、大きな値を指定しておくよりはスマートだと思う。
6.5 レンズ系の表示
マトリクスの計算だけではつまらないので、Mathematicaのグラフィクス機能を使ってレンズ系の表示を行うようにした。drawParaxialSystem[sys]で全体が表示される。表示形式はオプションに
sectionDrawing->Fullとして指定する。オプションの値として
section2D sectionHalf sectionPie Fullがある。section2Dを指定すると2次元断面が表示される。sectionHalfでは半分にカットされた形で、sectionPieでは手前上側の1/4がカットされた形で表示される。
drawParaxialSystemは描画にParametricPlotあるいはParametricPlot3Dを使っている。drawParaxialSystemのオプションにはsection2DではParametricPlotの、それ以外ではParametricPlot3Dのオプションを指定できる。
その他のオプションとして
drawOpticalAxis -> True opticalAxisStyle -> Directive[Red]がある。光軸を描くかどうか、描くならどんなスタイルで描くかを指定する。デフォルトは上の通り。
7 使用例
ということでなにか計算してみよう。7.1 単レンズ
In[2]:= singlet = buildParaxialSystem[{1, 0}, {{r1, t, n}, {r2, 0, 1}}, {1, 0}, 1] Out[2]= "- paraxial System -" In[3]:= focalLength[singlet] // Simplify Out[3]= -((n r1 r2)/((-1 + n) (n (r1 - r2 - t) + t)))これは整理すればここにある式に一致することがわかる。
こういうの式のまま計算できるのはMathematicaを使うメリット。
また、
In[8]:= Simplify[principalPoint[singlet, imageSpace] === nodalPoint[singlet, imageSpace]] Out[8]= Trueということで、前後の屈折率が一致していれば節点と主点は一致することが確認できる。
次回はもうちょっと面白そうな結果を示そう。
2010-10-05 22:29
nice!(0)
コメント(0)
トラックバック(0)
コメント 0