透鏡演示系統(tǒng)
框架
現(xiàn)在,我們可以做一個(gè)具備友好界面的透鏡演示系統(tǒng)了。我們需要兩個(gè)圓弧來表示透鏡,一條線段表示主光軸,多條線段表示光線的傳播路徑。此外,還需要對光源和透鏡的參數(shù)進(jìn)行調(diào)節(jié)。
然而值得注意的一點(diǎn)是,我們在進(jìn)行計(jì)算和畫圖過程中所用到的幾何圖形,在表達(dá)形式以及操作流程上可能并不相同。例如,對于光源發(fā)出的一條射線,它與透鏡的作用流程為
- 尋找與透鏡前表面的交點(diǎn)A
- 獲取反射和透射直線
- 尋找透射直線與透鏡后表面的交點(diǎn)B
- 計(jì)算透過透鏡的直線
然而對于畫圖程序來說,光源S和A之間有一條線段,A和B之間有一條線段,若想畫出透過透鏡的線段,則必須先確定這條線段的另一個(gè)端點(diǎn)。也就是說,在求解反射、透射光線的過程中,所得到的光線表達(dá)式對于畫圖來說并無意義,只有端點(diǎn)是有意義的。
至此,即可得到這個(gè)小程序中必不可少的一些數(shù)據(jù),包括光源參數(shù)、透鏡參數(shù)、光線與表面的交點(diǎn),光線端點(diǎn)組成的點(diǎn)對,所有光線的表達(dá)式,當(dāng)前仍在傳播的光線的表達(dá)式等。
于是可以建立如下代碼:
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() #光學(xué)元件對象 self .optiDict = {} #光學(xué)元件參數(shù) self .sourceDict = {} #光源 self .abcs = [] #所有光線的abc參數(shù) self .nodes = [] #交點(diǎn) self .dots = [] #點(diǎn)對,用于繪圖 self .rays = [] #仍在傳播的光線 self .InitPanel() #初始化模板 def InitPanel( self ): pass #暫時(shí)不想寫的地方可以用pass #設(shè)置透鏡 def setEdge( self ): pass |
其中,光學(xué)元件包括位置、折射率、孔徑、前表面曲率、后表面曲率等參數(shù);光源信息包括位置、角度等信息,可初始化為:
1
2
3
|
self .optiDict = { 'xPos' : 300 , 'nOpti' : 1 , 'Diameter' : 100 , 'lFocal' : 200 , 'rFocal' : 200 } self .sourceDict = { 'xSource' : 10 , 'ySource' : 100 , 'theta' : 0 } |
在上述所有計(jì)算所得的數(shù)據(jù)中,彼此有很密切的關(guān)系。例如點(diǎn)對是由兩個(gè)點(diǎn)組成,而每個(gè)點(diǎn)至少從屬于一個(gè)點(diǎn)對。而從光線的傳播角度出發(fā),除了光源,每個(gè)節(jié)點(diǎn)都有父節(jié)點(diǎn);除了最后的死點(diǎn),每個(gè)點(diǎn)都有一個(gè)子節(jié)點(diǎn)。對于任意一點(diǎn),只要遍歷其所有子節(jié)點(diǎn),就可以畫出這個(gè)點(diǎn)組成的所有線段。
以上就是Python光學(xué)仿真UI界面wxpython透鏡演示系統(tǒng)框架的詳細(xì)內(nèi)容,更多關(guān)于wxpython框架的資料請關(guān)注服務(wù)器之家其它相關(guān)文章!
原文鏈接:https://blog.csdn.net/m0_37816922/article/details/100526014