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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
很好
[***.229.124.182]2024年04月16日 23时53分29秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
WEB服务器安装oracle jdbc
2019-04-27
单元测试
2019-04-27
sql里的in对应linq的写法 及 IQueryable转化为Dictionary
2019-04-27
操作系统学习笔记:I/O输入系统
2019-04-27
网站的最大并发连接数
2019-04-27
如何才能成为一名架构师?
2019-04-27
如何清空文件上传控件里的选定文件(路径)
2019-04-27
操作系统学习笔记:保护
2019-04-27
条件编译符号与发布
2019-04-27
操作系统学习笔记:安全
2019-04-27
Oracle可插拔数据库的jdbc连接串写法
2019-04-27
ASP.NET MVC 提供与访问 Web Api
2019-04-27
注入式开发(二):.NET 匿名函数
2019-04-27
单元测试的好处
2019-04-27
对单元测试的理解
2019-04-27
操作系统学习笔记:分布式文件系统
2019-04-27
操作系统学习笔记:分布式系统结构
2019-04-27
单元测试之配置文件
2019-04-27
解决oracle 表被锁住问题
2019-04-27
操作系统学习笔记:分布式协调
2019-04-27