1. 물체 및 상거리, S 와 S` 구하기Optics/Miscellaneous2023. 10. 5. 20:38
Table of Contents
반응형
간단한 이미징 광학계를 구성할때 Zemax나 Code V에서 Paraxial lens와 Image simulater로 Alex 이미지 보면서 최적 배율 거리를 알 수도 있다. 하지만 이 보다 훨씬 간단하게 물체거리 S(L) 및 상거리 S`(L`)을 구할 수 있는 파이썬 GUI 코드를 작성해 보았다.
얇은 단일 렌즈를 가정한 수준임으로 매, 군 등 복합적인 렌즈들이 적용되는 Opitc System에는 맞지 않는다.
그러므로 복합적인 광학계를 구성할 경우 필히 Zemax 및 Code V와 같은 광선 추적 프로그램을 사용하길 바란다.
코드를 실행하면 아래와 같은 GUI 창이 열리게 된다.
배율은 렌즈의 초점거리에 의해 정해짐으로 초점거리와 배율을 입력하고 엔터를 누르면 S(L) 및 S`(L`) 값이 계산된다.
아래는 파이썬 코드 전문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
# The optic is placed behind the sample at a distance L1 that is slightly larger than its focal distance f.
# The image is formed a distance L2 = L1f /(L1 − f) behind the lens on a high resolution camera.
# The resulting magnification is m = L2/L1 = f /(L1 − f).
import tkinter as tk
from tkinter import ttk, StringVar
def calculate_L1(f, m):
return f * (1 + m) / m
def calculate_L2(f, L1):
return (L1 * f) / (L1 - f)
def calculate():
f = float(focal_length_entry.get())
m = float(magnification_entry.get())
L1 = calculate_L1(f, m)
L2 = calculate_L2(f, L1)
L1_result.set(f"L1 (from sample to lens): {L1:.4f} µm")
L2_result.set(f"L2 (from lens to camera): {L2:.4f} µm")
update_additional_info(f)
def key_pressed(event):
if event.keysym == 'Return':
calculate()
elif event.keysym == 'Escape':
focal_length_entry.delete(0, tk.END)
magnification_entry.delete(0, tk.END)
L1_result.set("")
L2_result.set("")
def update_additional_info(f):
for row in tree.get_children():
tree.delete(row)
magnifications = [0.5, 1, 5, 10, 50, 100, 200, 300, 400, 500]
for m in magnifications:
L1 = calculate_L1(f, m)
L2 = calculate_L2(f, L1)
tree.insert("", tk.END, values=(m, f"{L1:.4f}", f"{L2:.4f}"))
app = tk.Tk()
app.title("Lens Calculator")
app.geometry('400x700')
ttk.Label(app, text="Enter lens focal length (in µm):").pack(pady=10)
focal_length_entry = ttk.Entry(app)
focal_length_entry.pack(pady=10)
focal_length_entry.bind('<KeyRelease>', lambda e: update_additional_info(float(focal_length_entry.get())) if focal_length_entry.get() else None)
ttk.Label(app, text="Enter desired magnification:").pack(pady=10)
magnification_entry = ttk.Entry(app)
magnification_entry.pack(pady=10)
calculate_button = ttk.Button(app, text="Calculate", command=calculate)
calculate_button.pack(pady=20)
L1_result = StringVar()
L2_result = StringVar()
ttk.Label(app, textvariable=L1_result).pack(pady=10)
ttk.Label(app, textvariable=L2_result).pack(pady=10)
ttk.Label(app, text="Additional Info:").pack(pady=10)
tree = ttk.Treeview(app, columns=("Magnification", "L1", "L2"), show="headings")
tree.heading("Magnification", text="Magnification")
tree.heading("L1", text="L1 (µm)")
tree.heading("L2", text="L2 (µm)")
tree.column("Magnification", width=100)
tree.column("L1", width=100)
tree.column("L2", width=100)
tree.pack(pady=20)
app.bind('<Key>', key_pressed)
app.mainloop()
|
cs |
반응형
'Optics > Miscellaneous' 카테고리의 다른 글
6. What is light? (0) | 2024.03.19 |
---|---|
5. Laser Spot Size Calculator, 레이저 초점 크기 계산기 (1) | 2023.12.26 |
4. 대기에서 빛의 산란, 왜 하늘은 파란색인가? (1) | 2023.12.23 |
3. Huygens-Fresnel principle, Remind Diffraction (2) | 2023.12.05 |
2. Optimum Launching Condition for Hollow Fiber (0) | 2023.12.01 |