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

目录
  • 计算与绘图

计算与绘图

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

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绘图默认的坐标系并不是我们所熟知的那个坐标系,需要进行一次翻转。

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透镜演示系统计算与绘图的资料请关注我们其它相关文章!

(0)

相关推荐

  • wxPython使用系统剪切板的方法

    本文实例讲述了wxPython使用系统剪切板的方法.分享给大家供大家参考.具体如下: 程序运行效果如下图所示: 主要代码如下: import wx ######################################################################## class ClipboardPanel(wx.Panel): """""" #--------------------------------------

  • wxPython实现绘图小例子

    本文实例为大家分享了wxPython绘图小例子的具体实现代码,供大家参考,具体内容如下 一个绘图的例子: #!/usr/bin/env python # -*- coding: utf-8 -*- ''' Function:绘图 Input:NONE Output: NONE author: socrates blog:http://www.cnblogs.com/dyx1024/ date:2012-07-11 ''' import wx class PaintWindow(wx.Window

  • wxPython实现画图板

    本文实例为大家分享了wxPython画图板展示的具体代码,供大家参考,具体内容如下 #coding:GBK ''' Created on 2012-3-22 @author: cWX53049 ''' import wx import time from bsddb.test.test_pickle import cPickle import os _formatStr="%Y-%m-%d %H:%M:%S" class SkethWindow(wx.Window): def __in

  • wxPython绘图模块wxPyPlot实现数据可视化

    本文实例为大家分享了wxPython绘图模块wxPyPlot实现数据可视化的具体代码,供大家参考,具体内容如下 #-*- coding: utf-8 -*- ################################################################################ ## 使用wxPython的绘图模块wxPyPlot,需要数据可视化的时候,无需再借用其他的库或模块了 ######################################

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

    目录 计算与绘图 计算与绘图 这里的计算主要包括两个部分,分别是通过滚动条的参数得到光学器件的特征,这一点此前已经备述.其二则是光在传播过程中所产生的各种行为,反射折射函数也都已经讲过了,需要注意的就是确定边界. def getRay(self): self.rays,self.abcs,self.dots = [[],[],[]] sDot = self.source #光源为第一个点 sRay = rp.getABC(self.sourceDict['theta'],sDot) inPoin

  • Python光学仿真wxpython透镜演示系统初始化与参数调节

    初始化与参数调节面板 这一节将绘制出如下图所示的参数调节面板 对于上图来说,BoxSizer布局十分傻瓜,所以这里主要有两个方面需要注意,其一是opti和source这两个选项卡的实现,其二则是如何同时创建多个滚动条. 对于前者比较容易,无非是多用一个控件而已,即wx.NoteBook,使用方法乏善可陈,看代码即可学会. 对于后者当然也可以很容易,只要无脑罗列即可,只不过对于五个不同的参数就意味着要新建五组滚动条,要就要新建五个控制函数,而这五个控制函数的功能几乎是完全一样的.显然,这很愚蠢,所

  • Python光学仿真wxpython透镜演示系统框架

    透镜演示系统 框架 现在,我们可以做一个具备友好界面的透镜演示系统了.我们需要两个圆弧来表示透镜,一条线段表示主光轴,多条线段表示光线的传播路径.此外,还需要对光源和透镜的参数进行调节. 然而值得注意的一点是,我们在进行计算和画图过程中所用到的几何图形,在表达形式以及操作流程上可能并不相同.例如,对于光源发出的一条射线,它与透镜的作用流程为 寻找与透镜前表面的交点A 获取反射和透射直线 寻找透射直线与透镜后表面的交点B 计算透过透镜的直线 然而对于画图程序来说,光源S和A之间有一条线段,A和B之

  • Python光学仿真wxpython之DC绘图

    一般来说,系统与绘图程序之间的信息交换是由图形设备接口(Graphics Device Interface,GDI)实现的,在wxpython中,通过device context(DC)对象来实现GDI的功能. DC对象的创建非常简单,只需引用wx.PaintDC即可,而后则可通过dc来设置画笔dc.SetPen,有了画笔,就可以进行图形绘制了.于是,我们再考虑到图形的属性,包括形状.颜色与边框等,更细致地说,是图形形状.填充颜色.边框类型.边框颜色. 我们可以通过一个矩形的例子来说明: 上面的

  • python光学仿真学习wxpython创建手速测试程序

    滚动条是什么大家自然都是知道的,可以非常直观地显示数据的变化,或者可以非常方便地改变某些数值. 此前在介绍按钮.静态文本.输入文本这三个控件时,相对来说比较乏味,所以这次我们采用需求引导的模式.假如想编写一个软件用来检测打字速度,同时能够非常直观地通过滚动条来显示出来,应该怎么写? 我们大致需要三个控件,文本输入控件用来输入文字:静态文本控件用于显示速度:滚动条用来动态地显示速度.同时,还需要知道系统的时间,总之,代码如下 import wx import time #时间模块 class te

  • python光学仿真相速度和群速度计算理解学习

    目录 波动模型 相速度 群速度 从编程的角度来说,波动光学在某些情况下可以简单地理解为在光线模型的基础上,引入一个相位项. 波动模型 一般来说,三个特征可以确定空间中的波场:频率.振幅和相位,故光波场可表示为: import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D z = np.arange(15,200)*10 #单位为nm x = np.arange(15,200)

  • Python光学仿真教程实现光线追踪

    目录 光线追迹 几何抽象 光线 线段与圆弧 光线追迹 得益于计算机的计算的能力,通过追踪具有代表性的光线的传播轨迹,可以更加精确地描述光学系统的性能,光线追迹方法也因此大展其能,诸如Zemax.tracepro等软件便都提供了相应的功能. 而建立在折射定律基础之上的光线追迹方法,对数学功底要求较低,所以比较适合作为python初学者的入门项目.在接下来的这一章,希望通过对光线追迹的实现,掌握python中的列表.元组.字典.集合等数据类型的基本概念,并且对面向对象与函数式编程有一个基本的了解.

  • python光学仿真实现光线追迹之空间关系

    目录 空间关系 相交判定 射线排序 线弧关系 点弧关系 空间关系 变化始于相遇,所以交点是一切的核心. 相交判定 首先考察一束光线能否打在某个平面镜上.光线被抽象成了一个列表[a,b,c],平面镜则被抽象成为由两个点构成的线段[(x1,y1),(x2,y2)].两条直线的交点问题属于初等数学范畴,需要先将线段转换成直线的形式,然后再求交点.但是两条直线的交点可能落在线段的外面,从而不具有判定的意义. 如果我们的光学系统中有大量的光学元件,那么如果有一种方法可以快速判断光线是否与光学元件有交点,将

  • Python光学仿真学习处理高斯光束分布图像

    目录 通过python处理光斑图像 1 相关包与图像读取 2 图像截取 3显示强度 4数据拟合 问题 通过python处理光斑图像 1 相关包与图像读取 首先需要科学计算必备包numpy和画图包matplotlib.pyplot,我们通过后者进行图像数据的读取. plt.imread读取图片之后为数据格式为numpy数组,可以通过成员函数astype将整型数据变成浮点型,有利于后期处理. plt.imshow将img的数据加载到窗口,plt.show()显示绘图窗口,默认显示为伪彩图. pyth

  • Python光学仿真光的偏振编程理解学习

    目录 光的偏振 光的偏振 由于光波是横波,所以对于任意一个光波,其振幅方向与传播方向在一个固定的平面内.换言之,一束光波可以存在振幅方向不同的一群光波,对于其中一个光波而言,其振幅方向即为偏振方向. 可以画出其示意图 #偏振光演示 import numpy as np import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D as axd def polarShow(): z = np.arange(0,5,0

随机推荐