Python光學(xué)仿真wxpython透鏡演示系統(tǒng)計(jì)算與繪圖
計(jì)算與繪圖
這里的計(jì)算主要包括兩個(gè)部分,分別是通過滾動(dòng)條的參數(shù)得到光學(xué)器件的特征,這一點(diǎn)此前已經(jīng)備述。其二則是光在傳播過程中所產(chǎn)生的各種行為,反射折射函數(shù)也都已經(jīng)講過了,需要注意的就是確定邊界。
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)說,繪圖部分邏輯簡(jiǎn)單,需要注意的一點(diǎn)是,DC繪圖默認(rèn)的坐標(biāo)系并不是我們所熟知的那個(gè)坐標(biāo)系,需要進(jìn)行一次翻轉(zhuǎn)。
def DrawPath(self): w,h = self.drawPanel.GetSize() #獲取畫布尺寸 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]: #畫劣弧 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+Tkinter創(chuàng)建一個(gè)簡(jiǎn)單的鬧鐘程序
這篇文章主要為大家詳細(xì)介紹了如何使用 Python 的 Tkinter 庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的鬧鐘程序,它可以在指定的時(shí)間播放一個(gè)聲音來(lái)提醒你,感興趣的可以學(xué)習(xí)一下2023-04-04python調(diào)用短信貓控件實(shí)現(xiàn)發(fā)短信功能實(shí)例
這篇文章主要介紹了python調(diào)用短信貓控件實(shí)現(xiàn)發(fā)短信功能實(shí)例,需要的朋友可以參考下2014-07-07Python實(shí)現(xiàn)運(yùn)行其他程序的四種方式實(shí)例分析
這篇文章主要介紹了Python實(shí)現(xiàn)運(yùn)行其他程序的四種方式,結(jié)合實(shí)例形式分析了Python執(zhí)行其他程序相關(guān)模塊與函數(shù)使用技巧,需要的朋友可以參考下2017-08-08解決python3.x安裝numpy成功但import出錯(cuò)的問題
這篇文章主要介紹了解決python3.x安裝numpy成功但import出錯(cuò)的問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Python+Selenium實(shí)現(xiàn)自動(dòng)填寫問卷
本文主要介紹了Python+Selenium實(shí)現(xiàn)自動(dòng)填寫問卷,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Python3實(shí)現(xiàn)發(fā)送QQ郵件功能(html)
這篇文章主要為大家詳細(xì)介紹了Python3實(shí)現(xiàn)發(fā)送QQ郵件功能,html格式的qq郵件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12