透镜演示系统
框架
现在,我们可以做一个具备友好界面的透镜演示系统了。我们需要两个圆弧来表示透镜,一条线段表示主光轴,多条线段表示光线的传播路径。此外,还需要对光源和透镜的参数进行调节。
然而值得注意的一点是,我们在进行计算和画图过程中所用到的几何图形,在表达形式以及操作流程上可能并不相同。例如,对于光源发出的一条射线,它与透镜的作用流程为
- 寻找与透镜前表面的交点A
- 获取反射和透射直线
- 寻找透射直线与透镜后表面的交点B
- 计算透过透镜的直线
然而对于画图程序来说,光源S和A之间有一条线段,A和B之间有一条线段,若想画出透过透镜的线段,则必须先确定这条线段的另一个端点。也就是说,在求解反射、透射光线的过程中,所得到的光线表达式对于画图来说并无意义,只有端点是有意义的。
至此,即可得到这个小程序中必不可少的一些数据,包括光源参数、透镜参数、光线与表面的交点,光线端点组成的点对,所有光线的表达式,当前仍在传播的光线的表达式等。
于是可以建立如下代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
import raypath as rp class OptiTest(wx.Panel): def __init__( self ,parent = None ,size = ( 800 , 600 )): wx.Panel.__init__( self ,parent = parent, id = - 1 ,size = size) self .Bind(wx.EVT_PAINT, self .OnPaint) self .opti = rp.Opti() #光学元件对象 self .optiDict = {} #光学元件参数 self .sourceDict = {} #光源 self .abcs = [] #所有光线的abc参数 self .nodes = [] #交点 self .dots = [] #点对,用于绘图 self .rays = [] #仍在传播的光线 self .InitPanel() #初始化模板 def InitPanel( self ): pass #暂时不想写的地方可以用pass #设置透镜 def setEdge( self ): pass |
其中,光学元件包括位置、折射率、孔径、前表面曲率、后表面曲率等参数;光源信息包括位置、角度等信息,可初始化为:
1
2
3
|
self .optiDict = { 'xPos' : 300 , 'nOpti' : 1 , 'Diameter' : 100 , 'lFocal' : 200 , 'rFocal' : 200 } self .sourceDict = { 'xSource' : 10 , 'ySource' : 100 , 'theta' : 0 } |
在上述所有计算所得的数据中,彼此有很密切的关系。例如点对是由两个点组成,而每个点至少从属于一个点对。而从光线的传播角度出发,除了光源,每个节点都有父节点;除了最后的死点,每个点都有一个子节点。对于任意一点,只要遍历其所有子节点,就可以画出这个点组成的所有线段。
以上就是Python光学仿真UI界面wxpython透镜演示系统框架的详细内容,更多关于wxpython框架的资料请关注服务器之家其它相关文章!
原文链接:https://blog.csdn.net/m0_37816922/article/details/100526014