Python光學(xué)仿真wxpython透鏡演示系統(tǒng)計(jì)算與繪圖
計(jì)算與繪圖
這里的計(jì)算主要包括兩個(gè)部分,分別是通過(guò)滾動(dòng)條的參數(shù)得到光學(xué)器件的特征,這一點(diǎn)此前已經(jīng)備述。其二則是光在傳播過(guò)程中所產(chǎn)生的各種行為,反射折射函數(shù)也都已經(jīng)講過(guò)了,需要注意的就是確定邊界。
def getRay(self):
self.rays,self.abcs,self.dots = [[],[],[]]
sDot = self.source #光源為第一個(gè)點(diǎn)
sRay = rp.getABC(self.sourceDict['theta'],sDot)
inPoint,outPoint,flec,frac = self.opti.singleReflect(sRay,sDot,1)
if inPoint == []: return [] #無(wú)交點(diǎn)返回空l(shuí)ist
self.dots.append(inPoint)
self.rays.append([sDot,inPoint])
crossflec = self.crossRagion(flec,inPoint)
if crossflec != []:
self.dots.append(crossflec)
self.rays.append([inPoint,crossflec])
self.abcs.append(flec)
if outPoint == []: return []
self.dots.append(outPoint)
self.rays.append([inPoint,outPoint])
if frac == []: return []
crossfrac = self.crossRagion(frac,outPoint)
if crossflec != []:
self.dots.append(crossfrac)
self.rays.append([outPoint,crossfrac])
self.abcs.append(frac)
##求光線與界面邊緣的交點(diǎn)
def crossRagion(self,ray,point):
w,h = self.drawPanel.GetSize()
edges = [[(0,0),(0,w)],[(0,h/2),(0,-h/2)],[(0,-h/2),(w,-h/2)],
[(w,-h/2),(w,h/2)],[(w,h/2),(0,h/2)]]
for dots in edges:
cross=rp.getCross(ray,dots,point)
if cross!=[]:
return cross
return []
從代碼的可讀性來(lái)說(shuō),繪圖部分邏輯簡(jiǎn)單,需要注意的一點(diǎn)是,DC繪圖默認(rèn)的坐標(biāo)系并不是我們所熟知的那個(gè)坐標(biāo)系,需要進(jìn)行一次翻轉(zhuǎn)。
def DrawPath(self):
w,h = self.drawPanel.GetSize() #獲取畫(huà)布尺寸
dc = wx.ClientDC(self.drawPanel)
dc.SetPen(wx.Pen('#666666'))
dc.DrawRectangle(0,0,w,h)
dc.SetDeviceOrigin(0,h/2)
dc.SetAxisOrientation(True,True) #坐標(biāo)系翻轉(zhuǎn)
dc.SetPen(wx.Pen('#0000FF'))
dc.DrawLine(0,0,w,0)
dc.SetPen(wx.Pen('#00FF00'))
##繪制透鏡
for edge in self.opti.edges:
dots = edge['dots']
if len(dots)==2: #此時(shí)為平面
dc.DrawLine(dots[0][0],dots[0][1],
dots[1][0],dots[1][1])
elif len(dots)==3: #此時(shí)為曲面
x3,y3,_=rp.arc2cir(dots)
if dots[1][0]>dots[2][0]: #畫(huà)劣弧
dc.DrawArc(dots[0][0],dots[0][1],
dots[1][0],dots[1][1],x3,y3)
else:
dc.DrawArc(dots[1][0],dots[1][1],
dots[0][0],dots[0][1],x3,y3)
dc.SetPen(wx.Pen('#FF0000'))
##繪制光源
dc.DrawCircle(self.source[0],self.source[1],10)
##繪制光線
for ray in self.rays:
dc.DrawLine(ray[0][0],ray[0][1],
ray[1][0],ray[1][1])
##繪制光線與物體表面的交點(diǎn)
dc.SetPen(wx.Pen('#FF00FF'))
for dot in self.dots:
dc.DrawCircle(dot[0],dot[1],5)
至此,一個(gè)簡(jiǎn)易的光學(xué)透鏡模擬系統(tǒng)就搭建完成了。同時(shí),我們也學(xué)會(huì)了python的幾乎所有功能。
最后,再將源代碼的鏈接獻(xiàn)上:透鏡演示系統(tǒng)。
以上就是Python光學(xué)仿真wxpython透鏡演示系統(tǒng)計(jì)算與繪圖的詳細(xì)內(nèi)容,更多關(guān)于wxpython透鏡演示系統(tǒng)計(jì)算與繪圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Python實(shí)現(xiàn)復(fù)刻人生重開(kāi)模擬器
人生重開(kāi)模擬器是由VickScarlet上傳至GitHub的一款簡(jiǎn)單的文字網(wǎng)頁(yè)游戲。本文將用Python復(fù)刻一下這個(gè)游戲,感興趣的小伙伴可以嘗試一下2022-10-10
樹(shù)莓派用python中的OpenCV輸出USB攝像頭畫(huà)面
這篇文章主要為大家詳細(xì)介紹了樹(shù)莓派用python中的OpenCV輸出USB攝像頭畫(huà)面,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06
python mysql自增字段AUTO_INCREMENT值的修改方式
這篇文章主要介紹了python mysql自增字段AUTO_INCREMENT值的修改方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05
Python?第三方庫(kù)?Pandas?數(shù)據(jù)分析教程
這篇文章主要介紹了Python?第三方庫(kù)?Pandas?數(shù)據(jù)分析教程的相關(guān)資料,需要的朋友可以參考下2022-09-09
Python中的Numeric包和Numarray包使用教程
這篇文章主要介紹了Python中的Numeric包和Numarray包使用教程,來(lái)自IBM官方網(wǎng)站上的技術(shù)文檔,需要的朋友可以參考下2015-04-04
pandas與pyspark計(jì)算效率對(duì)比分析
這篇文章主要介紹了pandas與pyspark計(jì)算效率對(duì)比,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
pandas數(shù)據(jù)處理之 標(biāo)簽列字符轉(zhuǎn)數(shù)字的實(shí)現(xiàn)
這篇文章主要介紹了pandas數(shù)據(jù)處理之 標(biāo)簽列字符轉(zhuǎn)數(shù)字的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
Python 將字符串轉(zhuǎn)換為列表的7種方法匯總
這篇文章主要介紹了Python 將字符串轉(zhuǎn)換為列表的7種方法匯總,在本文中,我們將嘗試將給定的字符串轉(zhuǎn)換為列表,其中根據(jù)用戶(hù)的選擇,遇到空格或任何其他特殊字符,為此,我們?cè)趕tring中使用split()方法,需要的朋友可以參考下2023-11-11

