【raytracing】光線解析結果から自分で光線図を作成する方法[Python]

  • URLをコピーしました!

raytracing

前回、raytracingライブラリで光線の高さや位置、角度を取得する方法を紹介しました。

今回はraytracingライブラリの光線解析結果により得られた高さや位置から自分で光線図を作成する方法を紹介します。

前回の結果として「ImagingPath()」と「.trace()」を使って、光線の高さと位置、そして角度を取得するのはこんな感じでした。

from raytracing import *

path = ImagingPath()
path.append(Space(d=50))
path.append(Lens(f=10))
path.append(Space(d=50))

path.display(ObjectRays(diameter=1, halfAngle=np.radians(10), H=1, T=7))

angle_list = np.linspace(-10, 10, 7)

ray_list = []
for angle in angle_list:
    print(f"==========angle: {angle} deg==========")
    ray = Ray(y=0, theta=np.radians(angle))
    trace = path.trace(ray)

    for data in trace:
        print(data.y, data.z, data.theta)

実行結果
==========angle: -10.0 deg==========
0 0 -0.17453292519943295
0 0 -0.17453292519943295
-8.726646259971647 50.0 -0.17453292519943295
-8.726646259971647 50.0 0.6981317007977317
-8.726646259971647 50.0 0.6981317007977317
26.17993877991494 100.0 0.6981317007977317
==========angle: -6.666666666666666 deg==========
0 0 -0.11635528346628862
0 0 -0.11635528346628862
-5.817764173314431 50.0 -0.11635528346628862
-5.817764173314431 50.0 0.4654211338651545
-5.817764173314431 50.0 0.4654211338651545
17.453292519943293 100.0 0.4654211338651545
==========angle: -3.333333333333333 deg==========
0 0 -0.05817764173314431
0 0 -0.05817764173314431
-2.9088820866572154 50.0 -0.05817764173314431
-2.9088820866572154 50.0 0.23271056693257725
-2.9088820866572154 50.0 0.23271056693257725
8.726646259971647 100.0 0.23271056693257725
==========angle: 0.0 deg==========
0 0 0.0
0 0 0.0
0.0 50.0 0.0
0.0 50.0 0.0
0.0 50.0 0.0
0.0 100.0 0.0
==========angle: 3.333333333333334 deg==========
0 0 0.058177641733144325
0 0 0.058177641733144325
2.9088820866572163 50.0 0.058177641733144325
2.9088820866572163 50.0 -0.2327105669325773
2.9088820866572163 50.0 -0.2327105669325773
-8.726646259971648 100.0 -0.2327105669325773
==========angle: 6.666666666666668 deg==========
0 0 0.11635528346628865
0 0 0.11635528346628865
5.8177641733144325 50.0 0.11635528346628865
5.8177641733144325 50.0 -0.4654211338651546
5.8177641733144325 50.0 -0.4654211338651546
-17.453292519943297 100.0 -0.4654211338651546
==========angle: 10.0 deg==========
0 0 0.17453292519943295
0 0 0.17453292519943295
8.726646259971647 50.0 0.17453292519943295
8.726646259971647 50.0 -0.6981317007977317
8.726646259971647 50.0 -0.6981317007977317
-26.17993877991494 100.0 -0.6981317007977317

「.display()」を使うと上のような図が得られるのですが、これが結構使い勝手が悪くて、複数の光線図を作ると高さの範囲が簡単に変わってしまい、比較がしづらかったりします。

ということで今回はこの光線図を自分で作成する方法を紹介します。

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

高さと位置を取得し、光線図を作成する方法

流れとしては光線解析を行い、高さである「y」、位置である「z」を取得し、それぞれリストに格納します。

そして位置である「z」がXの値、高さである「y」がYの値としてプロットすると光線図が得られます。

ということでこんな感じです。

from raytracing import *
import matplotlib.pyplot as plt

path = ImagingPath()
path.append(Space(d=50))
path.append(Lens(f=10))
path.append(Space(d=50))

angle_list = np.linspace(-10, 10, 7)

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 = []; theta_optics = []
    for data in trace:
        y_optics.append(data.y)
        z_optics.append(data.z)
        theta_optics.append(data.theta)
    y_list.append(y_optics)
    z_list.append(z_optics)
    theta_list.append(theta_optics)

fig = plt.figure()
plt.clf()

for y_optics, z_optics in zip(y_list, z_list):
    plt.plot(z_optics, y_optics, color="red", lw=0.5)

plt.xlabel("Distance")
plt.ylabel("Height")
plt.show()

実行結果

これで光線図を作成することができました。

次回はraytracingライブラリでABCD行列のそれぞれの値と焦点位置を取得し、図に追加する方法を紹介します。

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

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

コメント

コメントする