Python光学仿真wxpython透镜演示系统计算与绘图
程序员文章站
2022-06-21 23:46:54
目录计算与绘图这里的计算主要包括两个部分,分别是通过滚动条的参数得到光学器件的特征,这一点此前已经备述。其二则是光在传播过程中所产生的各种行为,反射折射函数也都已经讲过了,需要注意的就是确定边界。de...
计算与绘图
这里的计算主要包括两个部分,分别是通过滚动条的参数得到光学器件的特征,这一点此前已经备述。其二则是光在传播过程中所产生的各种行为,反射折射函数也都已经讲过了,需要注意的就是确定边界。
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透镜演示系统计算与绘图的资料请关注其它相关文章!