新闻动态

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

发布日期:2021-12-23 07:10 | 文章来源:gibhub

计算与绘图

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

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

版权声明:本站文章来源标注为YINGSOO的内容版权均为本站所有,欢迎引用、转载,请保持原文完整并注明来源及原文链接。禁止复制或仿造本网站,禁止在非www.yingsoo.com所属的服务器上建立镜像,否则将依法追究法律责任。本站部分内容来源于网友推荐、互联网收集整理而来,仅供学习参考,不代表本站立场,如有内容涉嫌侵权,请联系alex-e#qq.com处理。

相关文章

实时开通

自选配置、实时开通

免备案

全球线路精选!

全天候客户服务

7x24全年不间断在线

专属顾问服务

1对1客户咨询顾问

在线
客服

在线客服:7*24小时在线

客服
热线

400-630-3752
7*24小时客服服务热线

关注
微信

关注官方微信
顶部