使用Turtle库绘制望远镜和显微镜成像系统原理图
Turtle库绘制望远镜和显微镜成像系统原理图
- (一)望远镜成像系统(两片凸透镜实现)
- (二)显微镜成像系统(两片凸透镜实现)
- (三)结语
(一)望远镜成像系统(两片凸透镜实现)
1.作用:利用望远镜能够看清远处的物体;
2.组成:由两组凸透镜组成。靠进物体的叫物镜,焦距较长;靠近眼睛的目镜,焦距较短,物镜的第二焦点与目镜的第一焦点重合;
3.原理:物镜的作用是使远处的物体在焦点附近成实像,目镜的作用相当于一个放大镜,用来把像放大
由于不同的透镜材质不同,折射率不同(如果要考虑这些的话,会有很多参数要设置),所以下面的透镜是随便画的,所以,下面透镜圆心角也是随便设的,合理即可。实现得效果大致如下
下面是为了方便自定义绘图,写了一些自定义函数
下面这个函数用来计算两向量之间的夹角,这个函数有两个参数,v1,v2它们是列表,分别存放在两个向量的四个坐标的位置信息位置。例如:v1=[x1,y1,x2,y2](第一个向量的两个坐标),v3=[x3,y3,x4,y4](第二个向量的两个坐标)。经函数计算后,返回的结果是两个向量的夹角。
这个函数在这个任务里的作用是,计算圆心角。
PS:这里是向量,因为向量有方向,有固定的夹角,而两条直线的夹角由两个。所以,这里是向量
def yuan_xin_jiao(v1, v2):#计算两向量夹角的函数dx1 = v1[2] - v1[0]dy1 = v1[3] - v1[1]dx2 = v2[2] - v2[0]dy2 = v2[3] - v2[1]angle1 = math.atan2(dy1, dx1)angle1 = int(angle1 * 180/math.pi)angle2 = math.atan2(dy2, dx2)angle2 = int(angle2 * 180/math.pi)if angle1*angle2 >= 0:included_angle = abs(angle1-angle2)else:included_angle = abs(angle1) + abs(angle2)if included_angle > 180:included_angle = 360 - included_anglereturn included_angle
下面这个是,标注图像上字母的函数,a,b是坐标位置,c是要标注的内容
def words(a,b,c):#标注字母的函数penup()goto(a,b)pendown()write(c,font=('Arial',7,'normal'))
这个函数,与上面的函数没啥区别,主要是字体大小不同
def character(a,b,c):#写汉字的函数penup()goto(a,b)pendown()write(c,font=('Arial',15,'normal'))
下面这个是计算两点之间距离的函数,x1,y1,x2,y2,分别是两点的横纵坐标
def distence(x1,y1,x2,y2):#计算两点之间距离的函数p1 = np.array([x1,y1])p2 = np.array([x2,y2])p3 = p2 - p1p4 = math.hypot(p3[0], p3[1])return p4
下面是画线前准备的函数,a,b跳转到指定位置
def draw(a,b):#画线前的准备函数penup()goto(a,b)pendown()
下面这个是计算两直线之间角度的函数line1,line2也是列表,分别存放两条直线的四个坐标位置,如:line1=[x1,y1,x2,y2](格式),返回在是焦点的坐标
def point(line1, line2): # 计算直线交点函数x1 = line1[0] # 取四点坐标y1 = line1[1]x2 = line1[2]y2 = line1[3]x3 = line2[0]y3 = line2[1]x4 = line2[2]y4 = line2[3]k1 = (y2 - y1) * 1.0 / (x2 - x1) # 计算k1,由于点均为整数,需要进行浮点数转化b1 = y1 * 1.0 - x1 * k1 * 1.0 # 整型转浮点型是关键if (x4 - x3) == 0: # L2直线斜率不存在操作k2 = Noneb2 = 0else:k2 = (y4 - y3) * 1.0 / (x4 - x3) # 斜率存在操作b2 = y3 * 1.0 - x3 * k2 * 1.0if k2 == None:x = x3else:x = (b2 - b1) * 1.0 / (k1 - k2)y = k1 * x * 1.0 + b1 * 1.0return x, y
代码如下:
from turtle import *
import math
import numpy as npdef yuan_xin_jiao(v1, v2):#计算两向量夹角的函数dx1 = v1[2] - v1[0]dy1 = v1[3] - v1[1]dx2 = v2[2] - v2[0]dy2 = v2[3] - v2[1]angle1 = math.atan2(dy1, dx1)angle1 = int(angle1 * 180/math.pi)angle2 = math.atan2(dy2, dx2)angle2 = int(angle2 * 180/math.pi)if angle1*angle2 >= 0:included_angle = abs(angle1-angle2)else:included_angle = abs(angle1) + abs(angle2)if included_angle > 180:included_angle = 360 - included_anglereturn included_angledef words(a,b,c):#标注字母的函数penup()goto(a,b)pendown()write(c,font=('Arial',7,'normal'))def character(a,b,c):#写汉字的函数penup()goto(a,b)pendown()write(c,font=('Arial',15,'normal'))def distence(x1,y1,x2,y2):#计算两点之间距离的函数p1 = np.array([x1,y1])p2 = np.array([x2,y2])p3 = p2 - p1p4 = math.hypot(p3[0], p3[1])return p4def draw(a,b):#画线前的准备函数penup()goto(a,b)pendown()def point(line1, line2): # 计算直线交点函数x1 = line1[0] # 取四点坐标y1 = line1[1]x2 = line1[2]y2 = line1[3]x3 = line2[0]y3 = line2[1]x4 = line2[2]y4 = line2[3]k1 = (y2 - y1) * 1.0 / (x2 - x1) # 计算k1,由于点均为整数,需要进行浮点数转化b1 = y1 * 1.0 - x1 * k1 * 1.0 # 整型转浮点型是关键if (x4 - x3) == 0: # L2直线斜率不存在操作k2 = Noneb2 = 0else:k2 = (y4 - y3) * 1.0 / (x4 - x3) # 斜率存在操作b2 = y3 * 1.0 - x3 * k2 * 1.0if k2 == None:x = x3else:x = (b2 - b1) * 1.0 / (k1 - k2)y = k1 * x * 1.0 + b1 * 1.0return x, yf1= eval(input("物镜的焦距f1:"))#这里设置为90
f2= eval(input("目镜的焦距f2:"))#这里设置为30
O1= eval(input("物镜的主点位置O1:"))#这里设置为(-80,0)
O2= eval(input("目镜的主点位置O2:"))#这里设置为(40,0)
H1= eval(input("物镜的高度H1:"))#这里设置为50
H2= eval(input("目镜的高度H2:"))#这里设置为30
Y1= eval(input("物镜的圆心位置Y1:"))#这里设置为(0,0)
Y2= eval(input("目镜的圆心位置Y2:"))#这里设置为(0,0)
Y= eval(input("平行光入射高度Y:"))#这里设置为40
X= eval(input("绘制平行光的起始位置X:"))#这里设置为-180character(-50,251,"望远镜成像系统")r1=distence(Y1,0,O1,H1)#物镜半径
Y1A=[Y1,0,O1,H1]#F2,A两点的横纵坐标
Y1B=[Y1,0,O1,-H1]
yuan_xin_jiao1=yuan_xin_jiao(Y1A,Y1B)#计算圆心角r2=distence(Y2,0,O2,H2)#目镜半径
Y2C=[Y2,0,O2,H2]#Y2,C两点的横纵坐标
Y2D=[Y2,0,O2,-H2]
yuan_xin_jiao2=yuan_xin_jiao(Y2C,Y2D)#计算圆心角draw(0,0)#画光轴,自行合理设置
fd(220)
fd(-440)draw(O1,H1)#画物镜
seth(-90-yuan_xin_jiao1/2)
circle(r1,yuan_xin_jiao1)
seth(90-yuan_xin_jiao1/2)
circle(r1,yuan_xin_jiao1)draw(O1,0)#画物镜的主平面
seth(-90)
fd(H1)
fd(-H1*2)draw(O2,H2)#画目镜
seth(-90-yuan_xin_jiao2/2)
circle(r2,yuan_xin_jiao2)
seth(90-yuan_xin_jiao2/2)
circle(r2,yuan_xin_jiao2)draw(O2,0)#画目镜的主平面
seth(-90)
fd(H2)
fd(-H2*2)pencolor('blue')#设定光线的颜色,和字体的颜色draw(X,Y)
seth(0)
fd(O1-X)JF1=[O1,Y,O1+f1,0]#E,F1两点的横纵坐标
CD=[O2,H2,O2,-H2]
x1,y1=point(JF1, CD)#计算两直线的交点,Q
goto(x1,y1)
fd(100)#自行合理设置draw(X,-Y)
fd(O1-X)KF1=[O1,-Y,O1+f1,0]#E,F1两点的横纵坐标
CD=[O2,H2,O2,-H2]
x2,y2=point(KF1, CD)#计算两直线的交点,P
goto(x2,y2)
fd(100)#自行合理设置words(O1,0,'O1')words(O2,0,'O2')words(O1,H1,'A')words(O1,-H1-15,'B')#相对于真实的位置,这里向下偏移15个单位,主要是为了美观,下面的代码中也有类似的操作,就不一一注释了words(O2,H2,'C')words(O2,-H2-15,'D')words(O1,Y-15,'J')words(O1,-Y,'K')words(x2,y2,'P')words(x1,y1,'Q')words(O1-f1,0,'-F1')words(O1+f1,0+15,'F1')words(O2-f2,0-15,'-F2')words(O2+f2,0,'F2')character(O1,H1+30,"物镜")character(O2,H2+30,"目镜")hideturtle()
done()
效果如下
(二)显微镜成像系统(两片凸透镜实现)
1.作用:用来观察细微物体或物体细微部。
2。原理:根据凸透镜的成像原理 ,要经过凸透镜的两次成像,先用一个接近物体的凸透镜使物体成-放大的实像,然后再用另一个接近眼睛的凸透镜把这个实像再次放大,就能看清很微小的物体。
3.组成:由一个透镜或者几个透镜的组合构成,离物体近的透镜叫物镜,其焦距较短;离眼睛近的透镜叫目镜,其焦距比物镜稍大,两镜间的距离可以调节。
实现大致效果如下:
下面这个函数是用来计算函数的倾斜角度的,用上面的计算向量夹角的函数当然也可以,但这里配合turtle.seth函数使用更方便
def angle(x1,y1,x2,y2):#计算直线的倾斜角度角度oue_put = math.atan((y1 - y2) / (x1-x2))oue_put = math.degrees(oue_put)return oue_put
看看代码吧:
from turtle import *
import math
import numpy as npdef angle(x1,y1,x2,y2):#计算直线的倾斜角度角度oue_put = math.atan((y1 - y2) / (x1-x2))oue_put = math.degrees(oue_put)return oue_putdef yuan_xin_jiao(v1, v2):#计算两向量夹角的函数dx1 = v1[2] - v1[0]dy1 = v1[3] - v1[1]dx2 = v2[2] - v2[0]dy2 = v2[3] - v2[1]angle1 = math.atan2(dy1, dx1)angle1 = int(angle1 * 180/math.pi)angle2 = math.atan2(dy2, dx2)angle2 = int(angle2 * 180/math.pi)if angle1*angle2 >= 0:included_angle = abs(angle1-angle2)else:included_angle = abs(angle1) + abs(angle2)if included_angle > 180:included_angle = 360 - included_anglereturn included_angledef words(a,b,c):#标注字母的函数penup()goto(a,b)pendown()write(c,font=('Arial',7,'normal'))def character(a,b,c):#写汉字的函数penup()goto(a,b)pendown()write(c,font=('Arial',15,'normal'))def distence(x1,y1,x2,y2):#计算两点之间距离的函数p1 = np.array([x1,y1])p2 = np.array([x2,y2])p3 = p2 - p1p4 = math.hypot(p3[0], p3[1])return p4def draw(a,b):#画线前的准备函数penup()goto(a,b)pendown()def point(line1, line2): # 计算直线交点函数x1 = line1[0] # 取四点坐标y1 = line1[1]x2 = line1[2]y2 = line1[3]x3 = line2[0]y3 = line2[1]x4 = line2[2]y4 = line2[3]k1 = (y2 - y1) * 1.0 / (x2 - x1) # 计算k1,由于点均为整数,需要进行浮点数转化b1 = y1 * 1.0 - x1 * k1 * 1.0 # 整型转浮点型是关键if (x4 - x3) == 0: # L2直线斜率不存在操作k2 = Noneb2 = 0else:k2 = (y4 - y3) * 1.0 / (x4 - x3) # 斜率存在操作b2 = y3 * 1.0 - x3 * k2 * 1.0if k2 == None:x = x3else:x = (b2 - b1) * 1.0 / (k1 - k2)y = k1 * x * 1.0 + b1 * 1.0return x, y
L= eval(input("主光轴的长度L:"))#这里设置为300
f1= eval(input("物镜的焦距f1:"))#这里设置为40
f2= eval(input("目镜的焦距f2:"))#这里设置为100
O1= eval(input("物镜的主点位置O1:"))#这里设置为(-80,0)
O2= eval(input("目镜的主点位置O2:"))#这里设置为(100,0)
H1= eval(input("物镜的高度H1:"))#这里设置为50
H2= eval(input("目镜的高距H2:"))#这里设置为100
Y1= eval(input("物镜的圆心位置Y1:"))#这里设置为(0,0)
Y2= eval(input("目镜的圆心位置Y2:"))#这里设置为(-20,0)
X= eval(input("物体的位置X:"))#这里设置为(-140,0)
Y= eval(input("物体的高度Y:"))#这里设置为40character(-50,251,"显微镜成像系统")r1=distence(Y1,0,O1,H1)#物镜半径
F1A=[Y1,0,O1,H1]#-F1,A两点的横纵坐标
F1B=[Y1,0,O1,-H1]#-F1,B两点的横纵坐标
yuan_xin_jiao1=yuan_xin_jiao(F1A,F1B)#计算圆心角r2=distence(Y2,0,O2,H2)#目镜半径
F2C=[Y2,0,O2,H2]#-F2,C两点的横纵坐标
F2D=[Y2,0,O2,-H2]##-F2,D两点的横纵坐标
yuan_xin_jiao2=yuan_xin_jiao(F2C,F2D)#计算圆心角draw(0,0)#画光轴
fd(L)
fd(-2*L)draw(O1,H1)#画物镜
seth(-90-yuan_xin_jiao1/2)
circle(r1,yuan_xin_jiao1)
seth(90-yuan_xin_jiao1/2)
circle(r1,yuan_xin_jiao1)draw(O1,0)#画物镜的主平面
seth(-90)
fd(H1)
fd(-H1*2)draw(O2,H2)#画目镜
seth(-90-yuan_xin_jiao2/2)
circle(r2,yuan_xin_jiao2)
seth(90-yuan_xin_jiao2/2)
circle(r2,yuan_xin_jiao2)draw(O2,0)#画目镜的主平面
seth(-90)
fd(H2)
fd(-H2*2)draw(X,0)#画物的位置
seth(90)
fd(Y)pencolor('blue')#设定光线的颜色,和字体的颜色
draw(X,Y)#跳转到Y点,画直线YA
seth(0)
fd(O1-X)YO1=[X,Y,O1,0]#Y,O1两点的横纵坐标
EF1=[O1,Y,O1+f1,0]
x1,y1=point(YO1, EF1)#计算两直线的交点
print(x1,y1)goto(x1,y1)#跳转到G点,画直线GJ
distence3=distence(x1,y1,O2,y1)#计算GJ的距离
fd(distence3)draw(X,Y)#跳转到Y点,画直线YG
goto(x1,y1)GO2=[x1,y1,O2,0]#G,O2两点的横纵坐标
JF2=[O2,y1,O2+f2,0]
x2,y2=point(GO2, JF2)#计算两直线的交点draw(x2,y2)#跳转到P点
angle1=angle(O2,0,x1,y1)#计算O2G的倾斜角度
seth(angle1)
distence1=distence(x1,y1,x2,y2)#计算GP的距离
for i in range (10):#这里是为了画倾斜的虚线fd(distence1/20)penup()fd(distence1/20)pendown()
fd(200)#自行合理设置draw(x2,y2)#跳转到P点
angle2=angle(O2,y1,x2,y2)##计算JP的倾斜角度
seth(angle2)
distence2=distence(O2,y1,x2,y2)#计算JP的距离
for i in range (10):#这里是为了画倾斜的虚线fd(distence2/20)penup()fd(distence2/20)pendown()
fd(300)#自行合理设置draw(x2,y2)#跳转到P点
for i in range (10):#这里是为了P点到主光轴的的虚线seth(-90)fd(y2/20)penup()fd(y2/20)pendown()#下面X点,B点,D点,G点,P点,J点的坐标皆偏离主光轴-15个单位,为了美观
words(X,-15,'X')words(X,Y,'Y')words(O1-f1,0,'F1')#F1左焦点words(O1,0,'O1')words(O1+f1,0,'-F1')#F1右焦点words(O2-f2,0,'F2')#F2左焦点words(O2,0,'O2')words(O2+f2,0,'-F2')#F2左焦点words(O1,H1,'A')words(O1,-H1-15,'B')words(O2,H2,'C')words(O2,-H2-15,'D')words(O1,Y-15,"E")words(x1,y1-15,"G")words(x2,y2-15,"P")words(O2,y1-15,"J")character(x2-30,y2/2,"虚像")character(O1,H1+30,"物镜")character(O2,H2+30,"目镜")hideturtle()
done()
效果如下:
(三)结语
木有了
如果有什么错误的地方,还请大家批评指正,不过错了也没啥关系,反正也没什么人看
最后,希望小伙伴们都能有所收获。码字不易,喜欢的话,关注一波在走吧
使用Turtle库绘制望远镜和显微镜成像系统原理图相关推荐
- python画笑脸-python 利用turtle库绘制笑脸和哭脸的例子
我就废话不多说了,直接上代码吧! import turtle turtle.pensize(5) turtle.pencolor("yellow") turtle.fillcolo ...
- python turtle画熊-Python使用turtle库绘制小猪佩奇(实例代码)
turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制.turtle图形绘制的概念诞生于1969年,成功应用于LOGO编程语言. turtle库绘制图形有一个基本框架:一个小海龟 ...
- 用python画玫瑰花教程-利用Python的turtle库绘制玫瑰教程
用Python的turtle库绘图是很简单的,闲来无事就画了一个玫瑰花,下面奉上源码.... 源码: ''' Created on Nov 18, 2017 @author: QiZhao ''' i ...
- python turtle画彩虹-Python利用turtle库绘制彩虹代码示例_天津SEO
天津SEO RGB模型:光的三原色,共同决定色相 HSB/HSV模型:H色彩,S深浅,B饱和度,H决定色相 需要将HSB模型转换为RGB模型 代码示例: #-*- coding:utf-8 –*- f ...
- python画图代码彩虹-Python利用turtle库绘制彩虹代码示例
语言:Python IDE:Python.IDE 需求 做出彩虹效果 颜色空间 RGB模型:光的三原色,共同决定色相 HSB/HSV模型:H色彩,S深浅,B饱和度,H决定色相 需要将HSB模型转换为R ...
- turtle库绘制圆_Python绘画:应用Turtle库绘制“抖音艺术字”
前言: 前段时间,非常火的抖音艺术字,利用眼睛的盲区,让人很难识别写的数字.其实正确的办法,找准一个点,就很容易区分了.下面用Python的Turtle库绘制,一个同样效果的图片.实现也是非常的简单, ...
- python樱花代码_使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
今天为大家介绍几个Python"装逼"实例代码,python绘制樱花.玫瑰.圣诞树代码实例,主要使用了turtle库 Python绘制樱花代码实例 动态生成樱花 效果图(这个是动态 ...
- 用python画圣诞树-使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
今天为大家介绍几个Python"装逼"实例代码,python绘制樱花.玫瑰.圣诞树代码实例,主要使用了turtle库 Python绘制樱花代码实例 动态生成樱花 效果图(这个是动态 ...
- python turtle画有趣的图形_Python turtle库绘制简单图形
一.简介 Python中的turtle库是一个直观有趣的图形绘制函数库.turtle库绘制图形有一个基本框架:一个小海龟在坐标系中爬行,其爬行轨迹形成了绘制图形. 二.简单的图形列举 1.绘制4个不同 ...
最新文章
- 《微软的软件测试之道》(How We Test Software at Microsoft)
- ubuntu18.04.4 环境变量设置 export path
- 在Windows上部署NTP Server
- 关于 redis、memcache、mongoDB 的对比
- C语言程序设计线上测试01,2001年C语言程序设计笔试A卷.doc
- 手写一个promise用法_手写一个自己的 JavaScript Promise 类库
- 求斐波那契数列第n位的几种实现方式及性能对比(c#语言)
- 对/boot/grub/grub.conf的理解
- 基于C语言的小游戏合集
- python 发邮件 抄送_Python 发送 email 的三种方式
- c++11新特性std::is_trivial
- HTMLCSS仿京东注册页面制作静态页面总结
- python笔记-爬取猎聘网招聘信息
- 2018领航杯awd简单复现
- 远程互动 gk服务器,不要错过!GKUI APP远程控制教程
- 苹果发布Swift编程语言 - iOS移动开发周报
- vba根据内容调整word表格_word表格技巧:如何对表格进行样式批处理
- vue引用public目录下文件
- 基于Python点餐外卖系统设计与实现 开题报告
- Custom Draw