最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python光學(xué)仿真wxpython透鏡演示系統(tǒng)計(jì)算與繪圖

 更新時(shí)間:2021年10月19日 15:06:34   作者:微小冷  
這篇文章主要為大家介紹了Python光學(xué)仿真wxpython透鏡演示系統(tǒng)計(jì)算與繪圖的實(shí)現(xiàn)示例。有需要的朋友可以借鑒參考下,希望能夠有所幫助

計(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()      #獲取畫布尺寸
    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)文章

最新評(píng)論

潮安县| 铜山县| 宜都市| 吉安市| 当阳市| 志丹县| 武川县| 诏安县| 海淀区| 息烽县| 蒙自县| 和政县| 长岭县| 资源县| 昌宁县| 正宁县| 通州市| 黄冈市| 阳山县| 汉川市| 五大连池市| 浦江县| 江北区| 于田县| 正镶白旗| 张家港市| 华安县| 余姚市| 霍州市| 东宁县| 泽普县| 开封市| 乌拉特前旗| 宣恩县| 南汇区| 元谋县| 商城县| 静海县| 宜都市| 麻栗坡县| 肇东市|