【raytracing】焦点距離を変化させ、特定の高さ(サイズ)の光線を得る方法[Python]

  • URLをコピーしました!

raytracing

前回、raytracingライブラリで光線が集まる位置(結像位置)を取得し、図に表示する方法を紹介しました。

今回はraytracingライブラリを使って、焦点距離を変化させ、特定の高さ(サイズ)の光線を得る方法を紹介します。

それでは始めていきましょう。

スポットが特定の高さ(サイズ)となる焦点距離の取得方法

スポットが特定の高さ、つまりは特定のサイズとなる焦点距離を取得するには、まず探索範囲を設定します。

例えば焦点距離が-100から100まで1ずつ検討する場合は「np.arange()」を使って次のように書けます。

f1_list = np.arange(-100, 100, 1)

次にスポットの最大値と最小値を設定します。

spotsize_max = 10
spotsize_min = -10

この場合、スポットの高さの最大値が10、最小値が-10であるため、最大のスポットサイズは20となり、最小は0となります。

次にこれまでやってきた通り、「ImagingPath()」の設定や光線の設定、各光学系におけるyの値(高さ)、zの値(位置)を取得します。

今回は角度(theta)は必要ないので取得しません。

ということでここまではこんな感じになります。

from raytracing import *
import matplotlib.pyplot as plt

f1_list = np.arange(-100, 100, 1)
angle_list = np.linspace(-10, 10, 7)

spotsize_max = 10
spotsize_min = -10

f1result_list = []
for f1 in f1_list:
    if f1 != 0:
        path = ImagingPath()
        path.append(Space(d=50))
        path.append(Lens(f=f1))
        path.append(Space(d=50))
    
        y_list = []; z_list = []; theta_list = []
        for angle in angle_list:
            ray = Ray(y=0, theta=np.radians(angle))
            trace = path.trace(ray)
        
            y_optics = []; z_optics = []
            for data in trace:
                y_optics.append(data.y)
                z_optics.append(data.z)
            y_list.append(y_optics)
            z_list.append(z_optics)

ここから条件に合う焦点位置を取得していきます。

まず最後の光学系とその一つ前の光学系におけるyの値(高さ)を取得します。

        y_lastoptics = y_list[-1]
        y1 = y_lastoptics[-2]
        y2 = y_lastoptics[-1]

最後の位置で特定のスポットサイズになるのはその光学系内で光線が集まる位置がない場合とある場合の2種類が存在する可能性が考えられます。

そこでまずは光線が集まる位置がない場合として、先ほど取得した「y1」、「y2」が同じ符号である場合を抽出します。

そして次にスポットの高さが指定した高さ(spotsize_minとspotsize_max)内にあるものを抽出します。

        if np.sign(y1) == np.sign(y2):
            if spotsize_min <= abs(y1) <= spotsize_max and spotsize_min <= abs(y2) <= spotsize_max:
                f1result_list.append(f1)

これで最後の光学系で光線が集まる位置がない場合でスポットサイズが特定のサイズとなる焦点位置が取得できます。

また逆に最後の光学系で光線が集まる位置がある場合は「if np.sign(y1) != np.sign(y2):」とします。

        if np.sign(y1) != np.sign(y2):
            if spotsize_min <= abs(y1) <= spotsize_max and spotsize_min <= abs(y2) <= spotsize_max:
                f1result_list.append(f1)

それではまずは最後の光学系で光線が集まる位置がない場合でスポットサイズが特定のサイズとなる焦点位置を取得してみます。

from raytracing import *
import matplotlib.pyplot as plt

f1_list = np.arange(-100, 100, 1)
angle_list = np.linspace(-10, 10, 7)

spotsize_max = 10
spotsize_min = -10

f1result_list = []
for f1 in f1_list:
    if f1 != 0:
        path = ImagingPath()
        path.append(Space(d=50))
        path.append(Lens(f=f1))
        path.append(Space(d=50))
    
        y_list = []; z_list = []; theta_list = []
        for angle in angle_list:
            ray = Ray(y=0, theta=np.radians(angle))
            trace = path.trace(ray)
        
            y_optics = []; z_optics = []
            for data in trace:
                y_optics.append(data.y)
                z_optics.append(data.z)
            y_list.append(y_optics)
            z_list.append(z_optics)
    
        y_lastoptics = y_list[-1]
        y1 = y_lastoptics[-2]
        y2 = y_lastoptics[-1]
        if np.sign(y1) == np.sign(y2):
            if spotsize_min <= abs(y1) <= spotsize_max and spotsize_min <= abs(y2) <= spotsize_max:
                f1result_list.append(f1)

print(f1result_list)

実行結果
[np.int64(26), np.int64(27), np.int64(28), np.int64(29), 
np.int64(30), np.int64(31), np.int64(32), np.int64(33), 
np.int64(34), np.int64(35), np.int64(36), np.int64(37), 
np.int64(38), np.int64(39), np.int64(40), np.int64(41), 
np.int64(42), np.int64(43), np.int64(44), np.int64(45), 
np.int64(46), np.int64(47), np.int64(48), np.int64(49), 
np.int64(50), np.int64(51), np.int64(52), np.int64(53), 
np.int64(54), np.int64(55), np.int64(56), np.int64(57), 
np.int64(58)]

この結果による焦点距離が26から58までが特定のスポットサイズとなるようです。

ということで最小の焦点距離である26と最大の焦点距離である58を図示してみましょう。

焦点距離26の場合

from raytracing import *

f1 = 26

path = ImagingPath()
path.append(Space(d=50))
path.append(Lens(f=f1))
path.append(Space(d=50))
path.display(ObjectRays(diameter=0.1, halfAngle=np.radians(10), H=1, T=7))

焦点距離58の場合

from raytracing import *

f1 = 58

path = ImagingPath()
path.append(Space(d=50))
path.append(Lens(f=f1))
path.append(Space(d=50))
path.display(ObjectRays(diameter=0.1, halfAngle=np.radians(10), H=1, T=7))

次に最後の光学系で光線が集まる位置がある場合でスポットサイズが特定のサイズとなる焦点位置を取得してみます。

from raytracing import *
import matplotlib.pyplot as plt

f1_list = np.arange(-100, 100, 1)
angle_list = np.linspace(-10, 10, 7)

spotsize_max = 10
spotsize_min = -10

f1result_list = []
for f1 in f1_list:
    if f1 != 0:
        path = ImagingPath()
        path.append(Space(d=50))
        path.append(Lens(f=f1))
        path.append(Space(d=50))
    
        y_list = []; z_list = []; theta_list = []
        for angle in angle_list:
            ray = Ray(y=0, theta=np.radians(angle))
            trace = path.trace(ray)
        
            y_optics = []; z_optics = []
            for data in trace:
                y_optics.append(data.y)
                z_optics.append(data.z)
            y_list.append(y_optics)
            z_list.append(z_optics)
    
        y_lastoptics = y_list[-1]
        y1 = y_lastoptics[-2]
        y2 = y_lastoptics[-1]
        if np.sign(y1) != np.sign(y2):
            if spotsize_min <= abs(y1) <= spotsize_max and spotsize_min <= abs(y2) <= spotsize_max:
                f1result_list.append(f1)

print(f1result_list)

実行結果
[np.int64(16), np.int64(17), np.int64(18), np.int64(19), np.int64(20), 
np.int64(21), np.int64(22), np.int64(23), np.int64(24), np.int64(25)]

こちらも最小の焦点距離である16と最大の焦点距離である25を図示してみましょう。

焦点距離16の場合

from raytracing import *

f1 = 16

path = ImagingPath()
path.append(Space(d=50))
path.append(Lens(f=f1))
path.append(Space(d=50))
path.display(ObjectRays(diameter=0.1, halfAngle=np.radians(10), H=1, T=7))

実行結果

焦点距離25の場合

from raytracing import *

f1 = 25

path = ImagingPath()
path.append(Space(d=50))
path.append(Lens(f=f1))
path.append(Space(d=50))
path.display(ObjectRays(diameter=0.1, halfAngle=np.radians(10), H=1, T=7))

実行結果

次回はraytracingライブラリでアパチャーのサイズの取得方法とレンズ位置の図示の方法を紹介します。

ではでは今回はこんな感じで。

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする