wxpython透镜演示系统(三):计算与绘图
发布日期:2021-10-06 15:05:19 浏览次数:9 分类:技术文章

本文共 2571 字,大约阅读时间需要 8 分钟。

计算与绘图

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

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的几乎所有功能。

最后,再将源代码的链接献上:。

转载地址:https://blog.csdn.net/m0_37816922/article/details/100534678 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:F#语言快速教程
下一篇:wxpython透镜演示系统(二):初始化与参数调节

发表评论

最新留言

很好
[***.229.124.182]2024年04月16日 23时53分29秒