大蟒蛇python教程共享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透镜演示系统计算与绘图的资料请关注<计算机技术网(www.ctvol.com)!!>其它相关文章!

需要了解更多python教程分享Python光学仿真wxpython透镜演示系统计算与绘图,都可以关注python教程分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/pythontutorial/886858.html

(0)
上一篇 2021年10月22日
下一篇 2021年10月22日

精彩推荐