python光學仿真面向?qū)ο蠊鈱W元件類的實現(xiàn)
光學元件類
平面反射鏡是一種極為簡單的模型,因為我們只需要考慮一個平面即可。但是除此之外的其他光學元件,可能會變得有些復雜:我們必須考慮光在入射面和出射面的行為。
這當然是一句廢話,而且我們也有了一個初步的解決方案:將光學元件拆成前表面和后表面即可。如果光需要在光學元件中反射多次,那就將光學元件拆成需要反射次數(shù)的表面?zhèn)€數(shù)即可,完美而無腦。
這說明我們已經(jīng)熟悉了程序員的思維,我們眼中的世界已經(jīng)不再是一個所見即所得的世界,我們看到的是一個個抽象零部件的表現(xiàn)。但是也不要驚慌,程序員和正常人也未必有很大的區(qū)別,因為我們除了可以將這個世界拆解,也可以將拆解之后的部件重新構(gòu)造回這個世界。
嘗試著將問題想得復雜一些,光學系統(tǒng)中有許多光學元件,光會透過每個光學元件很多次,而且每次的入射點、出射點都會有一定的偏差。由于光學元件可能會對光的能量有所吸收,從而引起發(fā)熱。而且每次的入射點、出射點不同,則發(fā)熱位置也不一樣。由于發(fā)熱會導致光學元件發(fā)生形變,所以下一次光和光學元件的作用也會發(fā)生變化。
也就是說,對于每個光學元件來說,除了有固定的前表面、后表面,還有入射點、出射點、發(fā)熱、形變等不斷變化的參數(shù)。這樣的一個過于實際的問題促使我們構(gòu)造一種更加貼近現(xiàn)實的數(shù)據(jù)類型,換句話說,我們要創(chuàng)建一個對象,這個對象能夠封裝各種變量和功能,我們輸入一個參量,這個對象的狀態(tài)也會跟著發(fā)生變化。
這就是所謂的面向?qū)ο蟆?/p>
class Opti(): def __init__(self,edge1,edge2): self.edge1 = edge1 self.edge2 = edge2
在上例中,我們定義了一個光學元件類,這個光學元件有兩個表面,這兩個表面既可以是平面,也可以說弧面。這樣,我們就建立了一個類。其中,__init__
為初始化方法,self
表示我們所創(chuàng)建的這個類本身。一般來說,如果類中的方法不加修飾符的話,就必須將self
當作第一個參數(shù)。
self.edge1
表示這個Opti
類中,有一個成員的名字叫edge1
。當這個類被初始化的時候,我們就可以對其進行賦值了。
有些元件可能只有一個表面,比如全反鏡;有些可能有多個表面,比如偏振立方體。而且,我們在做實驗的時候,也需要對不同的光學元件進行比較,從而得到最好的實驗結(jié)果。所以,如果我們想改變已經(jīng)建好的光學元件,應該怎么辦呢?
其實很簡單,只要增加一個方法,使得可以插入或者刪除新的表面即可。
#文件Opti.py class Opti(): def __init__(self,edges=[[(0,-1),(0,1)],[(0,1),(0,-1),(1/2,0)]]): self.edges = [{'index':i,'dots':edges[i]} for i in range(len(edges))] #edge格式為(dot1,dot2,...) def insertEdge(self,edge,albedo=0): self.edges.append( {'index':len(self.edges),'dots':edge}) #可接受編號和點集 def delEdge(self,edge): try: if isinstance(edge,list): #如果edge的類型是list for edg in self.edges: if edg['dots']==edge: edge = edg['index'] del self.edges[edge] except: print("no this edge")
在上面的代碼中,可以看到初始化函數(shù)被預設(shè)了一些值,這點與普通函數(shù)并無二致。我們可以看到,默認插入的兩個曲面分別是平面[(0,-1),(0,1)]
和弧面[(0,1),(0,-1),(1/2,0)]
,可見默認生成一個平凸鏡。
成員變量self.edges
即光學表面的列表,每個光學表面有兩個參數(shù),分別是索引index
和點集dots
。由此前的光學抽象可知,當點對中有兩個點的時候,代表平面;有三個點的時候,代表弧面。
方法insertEdge
為插入一個光學表面,其中,編號為這個光學表面在self.edges
中的索引號;delEdge
顧名思義為刪除某個光學表面。如果傳入的edge
為一個列表,則說明傳入的是一個參數(shù)確定的曲面,此時通過遍歷self.edges
找到這個表面,并得到其索引。
如果傳入的參數(shù)為一個單值,那么說明傳入的是索引號,所以直接刪除即可。
在這個方法中,使用了一種新的代碼塊try:...except...
,這是一種異常機制,即嘗試運行try:
塊中的代碼,如果運行失敗,則執(zhí)行except
。如果我們沒能執(zhí)行成功delEdge
,則說明我們輸入的表面并不在這個光學元件中,所以輸出"no this edge"
。
這好像是第一次看到print
這個命令呢,一般來說這應該是最先接觸到的函數(shù),畢竟對于大多數(shù)程序員來說,敲下的第一行代碼就是
print("hello world") print('hello world')
同時,我們除了數(shù)值類型之外,又認識了另一種數(shù)據(jù)類型,即字符。在python中,可以通過雙引號或者單引號來表示單個字符或者字符串。即上述的hello world代碼中,兩行均正確,而且沒什么區(qū)別。
現(xiàn)在,我們已經(jīng)寫了一個類,于是可以創(chuàng)建一個對象,在命令行中輸入:
>>> from Opti import Opti >>> Opti.__name__ #這是什么鬼 'Opti' >>> x = Opti() #創(chuàng)建對象,由于未輸入?yún)?shù),故皆為默認值 >>> x.edges #現(xiàn)實類成員 [{'index': 0, 'dots': [(0, -1), (0, 1)]}, {'index': 1, 'dots': [(0, 1), (0, -1), (0.5, 0)]}] >>> x.delEdge(1) #調(diào)用類方法 >>> x.edges #果然少了一個邊 [{'index': 0, 'dots': [(0, -1), (0, 1)]}] >>> x.delEdge(1) #刪除不存在的邊是不可能的 no this edge >>>
首先,from Opti import Opti
的這兩個Opti并不相同,前者代表包`Opti.py',后者代表Opti.py中的類'Opti',import之后便可以調(diào)用了。
然后出現(xiàn)了一個比較吊詭的事情,我們在類中并沒有定義__name__
,然而調(diào)用之后卻有值產(chǎn)生。
請勿驚慌,其實是老熟人了??梢詫?code>__name__理解為python內(nèi)部的內(nèi)置屬性,當我們直接執(zhí)行某一.py文件時,這個__name__
的值為__main__
,否則的話就是類的名字。所以,到這個時候,我們似乎應該能明白入口函數(shù)的真正意義了吧。
繼續(xù)向下,幾乎所有的事情就都不出所料了。
以上就是python光學仿真面向?qū)ο蠊鈱W元件類的實現(xiàn)的詳細內(nèi)容,更多關(guān)于python光學元件類的實現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
numpy:np.newaxis 實現(xiàn)將行向量轉(zhuǎn)換成列向量
今天小編就為大家分享一篇numpy:np.newaxis 實現(xiàn)將行向量轉(zhuǎn)換成列向量,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-11-11Matplotlib實現(xiàn)subplot和subplots簡單對比
在畫布創(chuàng)建子圖會有很多方法,本文主要介紹了Matplotlib實現(xiàn)subplot和subplots簡單對比,簡單的介紹了這兩種方法區(qū)別,感興趣的可以了解一下2021-05-05python3使用diagrams繪制架構(gòu)圖的步驟
這篇文章主要介紹了python3使用diagrams生成架構(gòu)圖的步驟,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下2021-04-04python機器學習算法與數(shù)據(jù)降維分析詳解
這篇文章主要為大家介紹了python機器學習算法與數(shù)據(jù)降維的分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2021-11-11python將天數(shù)轉(zhuǎn)換為日期字符串的方法實例
這篇文章主要給大家介紹了關(guān)于python將天數(shù)轉(zhuǎn)換為日期字符串的相關(guān)資料,以及將將字符串的時間轉(zhuǎn)換為時間戳的實例代碼,需要的朋友可以參考下2022-01-01使用 Supervisor 監(jiān)控 Python3 進程方式
今天小編就為大家分享一篇使用 Supervisor 監(jiān)控 Python3 進程方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12