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

Python光學仿真教程實現(xiàn)光線追蹤

 更新時間:2021年10月19日 17:16:52   作者:微小冷  
傳統(tǒng)的高斯光學是建立在傍軸近似基礎之上的理想成像理論,這種處理以物像關系為核心,通過基點對光路的成像特性進行描述。然而,傍軸近似在一定程度上犧牲了精確性,從而使得需要一套像差理論作為補充

光線追跡

得益于計算機的計算的能力,通過追蹤具有代表性的光線的傳播軌跡,可以更加精確地描述光學系統(tǒng)的性能,光線追跡方法也因此大展其能,諸如Zemax、tracepro等軟件便都提供了相應的功能。

而建立在折射定律基礎之上的光線追跡方法,對數(shù)學功底要求較低,所以比較適合作為python初學者的入門項目。在接下來的這一章,希望通過對光線追跡的實現(xiàn),掌握python中的列表、元組、字典、集合等數(shù)據(jù)類型的基本概念,并且對面向對象與函數(shù)式編程有一個基本的了解。

幾何抽象

光線

光線追跡描述的是光線與光學元件接觸之后的行為變化,因此首先需要對光線與光學元件進行刻劃。由于我們希望最終建立一個二維的光路系統(tǒng),光線既可能水平,也可能豎直,因此通過 a x + b y + c = 0 來表示一條光線。即只需$a b c $這三個數(shù)字,便可以確定二維空間中的一條直線。

在python中,可以通過序列-list來表示一組數(shù)據(jù),在list中,每個元素都分配一個數(shù)字作為索引,可以通過索引來提取或改變list中的值。需要注意的是,和諸多編程語言類似,python中的索引也是從0開始的。所以我們可以在python中新建一個變量來表示一條過原點斜率為1的直線:

>>> abc=[1,-1,0]    #在python中,list用方括號表示
>>> type(abc)       #type函數(shù)可以返回數(shù)據(jù)類型
<class 'list'>
>>> abc[0]          #在python中,用方括號進行索引
1
>>> abc[1] = 5      #list中的值可以更改
>>> abc[-1]         #在python中,索引-1往往表示倒數(shù)第一個值
0
>>> abc             #修改后的abc
[1, 5, 0]

當然,光線實質(zhì)上是一種有源的射線,所以需要對直線方程 a x + b y + c = 0 進行符號約定,進而明確其方向性。
考慮到[a,b,c]與[-a,-b,-c]可以表示同一條直線,所以我們可以通過 a 和 b的正負號來表明其方向。通過射線終點所在象限對[a,b]的正負號進行限定,可以得到幾組不同的符號約定,在此我們選取如下約定:

在這里插入圖片描述

可以看到第一、三條射線的方程表示同一條直線,但由于引入符號約定,所以我們可以區(qū)分其方向上的差別,從而可以判斷這條光線是否會與某一光學元件相交。

如果希望繪制出一條光線,可以調(diào)用python的UI庫wxpython,為了不影響內(nèi)容的連貫性,這種方法會在后面統(tǒng)一講解。

除了這里所推薦的直線的abc表示法,我們還可以通過始點與角度來對光線進行表示,我們同樣可以使用三個參數(shù)[x0,y0,theta]。但是在進行計算的時候,需要先將其轉換成為[a,b,c]的表示方法,因此需要定義轉換函數(shù),即通過初始點和角度生成射線的函數(shù),考慮到此前的符號約定,其轉換公式為

在這里插入圖片描述

需要注意的一點是,這里需要調(diào)用numpy包來使用三角函數(shù)。

import numpy as np
x0,y0,theta = [0,0,np.pi/4]     #np.pi即圓周率
abc = [np.sin(theta),           #在python中,括號內(nèi)換行可以不用標記
      -np.cos(theta),
      -(np.sin(theta)*x0-np.cos(theta)*y0)]

由于這個方法可能會被經(jīng)常使用,所以可以封裝成函數(shù),在python中,通過關鍵字def進行函數(shù)的定義。對于參數(shù)個數(shù)和返回值的個數(shù)以及數(shù)據(jù)類型幾乎沒有限制。故可以寫為

import numpy as np
def getABC(x0,y0,theta):    #函數(shù)定義格式為 def 函數(shù)名(傳入?yún)?shù)):
    a = np.sin(theta)       #函數(shù)下方需要進行縮進
    b = -np.cos(theta)
    c = -(np.sin(theta)*x0-np.cos(theta)*y0)
return a,b,c                #在python中,通過return返回abc參數(shù)

也可以寫為

import numpy as np
def getABC(x0,y0,theta):
    return [np.sin(theta),      #在括號內(nèi)可以直接換行
            -np.cos(theta),
            -(np.sin(theta)*x0-np.cos(theta)*y0)]

在命令行中調(diào)用

>>> import test
>>> import numpy as np
>>> test.getABC(0,0,-np.pi/4)
[-0.7071067811865476, -0.7071067811865476, 0.0]

線段與圓弧

在光學系統(tǒng)中,最常見的光學器件便是平面鏡和透鏡,則其在入射光線子午面上的投影可拆解為線段和圓弧。

對于線段,可以非常直觀地通過兩個點進行表示。在python中,除了列表之外,可以用元組(tuple)來表示序列,不同之處在于元組的元素不能修改。在此,用飽含兩個元素的元組來表示一個點,將兩個點組成列表來表示線段:

>>> a = (0,0)       #在python中,元組用小括號表示
>>> b = (1,1)
>>> seg = [a,b]     #列表中的元素可以有不同的類型
>>> seg
[(0, 0), (1, 1)]
>>>

圓可以通過圓心與半徑來表示,簡潔而利于計算。圓弧則可以通過圓與角度來表示。但是作為光學元件的組成部分,為了便于后面的處理,其表現(xiàn)形式最好與線段相似,即通過三點即A、B、C來確認一段圓弧。

在這里插入圖片描述

但是具體計算的過程中往往需要將圓弧轉換成圓的表達形式進行操作,所以定義函數(shù)arc2cir來實現(xiàn)這個功能。由于其數(shù)學過程過于簡單,故只對一些命令進行說明,其中np.lialg為numpy的線性代數(shù)包,np.linalg.norm為求范數(shù),np.linalg.norm(a-b)相當于求a、b兩點之間的距離。

def arc2cir(arc):
    arc = np.array(arc)     #list不能進行數(shù)組運算,需要轉成np.array的形式
    dCD = np.linalg.norm(1/2*(arc[0]+arc[1])-arc[2])  #CD長度
    dBC2 = np.sum(np.square(arc[1]-arc[2]))           #BC**2
    radius = 0.5*dBC2/dCD                             #圓半徑
    theta = (arc[2]-1/2*(arc[0]+arc[1]))/dCD          #三角函數(shù)值
    zero = arc[2]-radius*theta
    return list(zero)+[radius]                        #列表相加為其內(nèi)部元素的合并

需要注意的是,在python中,list、tuple都不支持整體上的數(shù)學計算,這很容易理解,因為二者中存儲的不一定是數(shù)字,而可能是其他的什么東西。格式不同,自然無法計算。因此在考慮計算之前,需要將二者轉換成numpy.array這種數(shù)組格式。

列表、元組、數(shù)組之間的轉換非常簡單而直觀。

import numpy as np
>>> lis = [1,2,3]
>>> tup = tuple(lis)
>>> arr = np.array(tup)
>>> arr
array([1, 2, 3])
>>> lis
[1, 2, 3]
>>> tup
(1, 2, 3)

以上就是Python光學仿真教程實現(xiàn)光線追蹤的詳細內(nèi)容,更多關于Python實現(xiàn)光線追蹤的資料請關注腳本之家其它相關文章!

相關文章

  • Jupyter Notebook輸出矢量圖實例

    Jupyter Notebook輸出矢量圖實例

    這篇文章主要介紹了Jupyter Notebook輸出矢量圖實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • 基于Python實現(xiàn)PDF動畫翻頁效果的閱讀器

    基于Python實現(xiàn)PDF動畫翻頁效果的閱讀器

    在這篇博客中,我們將深入分析一個基于 wxPython 實現(xiàn)的 PDF 閱讀器程序,該程序支持加載 PDF 文件并顯示頁面內(nèi)容,同時支持頁面切換動畫效果,文中有詳細的代碼示例,需要的朋友可以參考下
    2025-01-01
  • Matplotlib使用Cursor實現(xiàn)UI定位的示例代碼

    Matplotlib使用Cursor實現(xiàn)UI定位的示例代碼

    這篇文章主要介紹了Matplotlib使用Cursor實現(xiàn)UI定位的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • python根據(jù)文件大小打log日志

    python根據(jù)文件大小打log日志

    這篇文章主要介紹了python根據(jù)文件大小打log日志的方法,可實現(xiàn)循環(huán)打日志,即第一個文件達到maxBytes大小后就寫入第二個文件,以此類推,是非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • flask框架視圖函數(shù)用法示例

    flask框架視圖函數(shù)用法示例

    這篇文章主要介紹了flask框架視圖函數(shù)用法,結合實例形式分析了flask框架視圖函數(shù)常見配置與使用技巧,需要的朋友可以參考下
    2018-07-07
  • Python實現(xiàn)數(shù)字的格式化輸出

    Python實現(xiàn)數(shù)字的格式化輸出

    這篇文章主要介紹了Python如何實現(xiàn)數(shù)字的格式化輸出,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-08-08
  • python實現(xiàn)自動化腳本編寫

    python實現(xiàn)自動化腳本編寫

    自動化在很多時候是很方便的,本文以修改用戶名密碼單元為案例,編寫測試腳本。完成修改用戶名密碼模塊單元測試,感興趣的可以了解一下
    2021-06-06
  • 解決pyecharts在jupyter notebook中使用報錯問題

    解決pyecharts在jupyter notebook中使用報錯問題

    這篇文章主要介紹了解決pyecharts在jupyter notebook中使用報錯問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • Pandas篩選某列過濾的方法

    Pandas篩選某列過濾的方法

    本文主要介紹了Pandas篩選某列過濾的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Python類型轉換的魔術方法詳解

    Python類型轉換的魔術方法詳解

    這篇文章主要介紹了Python類型轉換的魔術方法詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

沙河市| 陆丰市| 阆中市| 沾益县| 山东| 辽中县| 潼关县| 井陉县| 阆中市| 开原市| 大英县| 翼城县| 万载县| 思茅市| 新竹县| 平遥县| 如皋市| 双峰县| 万盛区| 马边| 石首市| 贵港市| 加查县| 鄯善县| 易门县| 东莞市| 临朐县| 丰城市| 海南省| 古蔺县| 渝中区| 湘乡市| 信丰县| 含山县| 抚宁县| 育儿| 安康市| 临沂市| 大姚县| 沽源县| 萍乡市|