脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python光学仿真wxpython透镜演示系统计算与绘图

Python光学仿真wxpython透镜演示系统计算与绘图

2022-02-11 23:16微小冷 Python

这篇文章主要为大家介绍了Python光学仿真wxpython透镜演示系统计算与绘图的实现示例。有需要的朋友可以借鉴参考下,希望能够有所帮助

计算绘图

这里的计算主要包括两个部分,分别是通过滚动条的参数得到光学器件的特征,这一点此前已经备述。其二则是光在传播过程中所产生的各种行为,反射折射函数也都已经讲过了,需要注意的就是确定边界。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def getRay(self):
    self.rays,self.abcs,self.dots = [[],[],[]]
    sDot = self.source          #光源为第一个点
    sRay = rp.getABC(self.sourceDict['theta'],sDot)
    inPoint,outPoint,flec,frac = self.opti.singleReflect(sRay,sDot,1)
    if inPoint == []: return [] #无交点返回空list
    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)
##求光线与界面边缘的交点
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 []

从代码的可读性来说,绘图部分逻辑简单,需要注意的一点是,DC绘图默认的坐标系并不是我们所熟知的那个坐标系,需要进行一次翻转。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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)    #坐标系翻转
    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:                #此时为平面
            dc.DrawLine(dots[0][0],dots[0][1],
                            dots[1][0],dots[1][1])
        elif len(dots)==3:              #此时为曲面
            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])
    ##绘制光线与物体表面的交点
    dc.SetPen(wx.Pen('#FF00FF'))
    for dot in self.dots:
        dc.DrawCircle(dot[0],dot[1],5)

至此,一个简易的光学透镜模拟系统就搭建完成了。同时,我们也学会了python的几乎所有功能。

最后,再将源代码的链接献上:透镜演示系统

以上就是Python光学仿真wxpython透镜演示系统计算与绘图的详细内容,更多关于wxpython透镜演示系统计算与绘图的资料请关注服务器之家其它相关文章!

原文链接:https://blog.csdn.net/m0_37816922/article/details/100534678

延伸 · 阅读

精彩推荐