import tkinter as tk
import threading
class Axis: #主光轴
def __init__(self): #创建主光轴
self.line=cv_display.create_line(0, 0, 1000, 0, width=2, arrow="none", dash=(2,1,2,1)) #dash参数设置为虚线
def move(self, y): #根据坐标移动
self.rel_y=get_relpos(y=y)[1] #转换为画布坐标
cv_display.coords(self.line, (0, self.rel_y, 1000, self.rel_y)) #重置位置
class Obj: #物体
def __init__(self, h): #创建物体,h为高度
self.h=round(h)
self.pic=cv_display.create_line((0, 0, 0, self.h), width=3, arrow="last", arrowshape=(20, 30, 10), fill="black", state="normal")
def move(self, x, y): #根据坐标移动
self.x=x
self.rel_x, self.rel_y=get_relpos(x, y) #转换为画布坐标
cv_display.coords(self.pic, (self.rel_x, self.rel_y, self.rel_x, self.rel_y-self.h)) #重置位置
class Len: #透镜
def __init__(self, h): #创建透镜,h为高度
self.h=round(h)
self.convex=cv_display.create_line((0, 0, 0, self.h), width=1, arrow="both", arrowshape=(10, 30, 5)) #创建凸透镜
self.concave=cv_display.create_line((0, 0, 0, self.h), width=1, arrow="both", arrowshape=(-10, -30, 5)) #创建凹透镜
self.flat=cv_display.create_line((0, 0, 0, self.h), width=1, arrow="none") #创建f=0的透镜替代品
def status_process(self): #根据焦距选择合适的透镜状态, 隐藏其他状态
if f>0:
cv_display.itemconfigure(self.convex, state="normal")
cv_display.itemconfigure(self.concave, state="hidden")
cv_display.itemconfigure(self.flat, state="hidden")
self.pic=self.convex
elif f0:
if abs(u)>f:
self.real=True
elif abs(u)0:
k1=(inc[1]-start[1])/u
k2=k1-(inc[1]-axis_y)/f
return k2
elif u0:
return 1
elif x
大致原理:
0.PNG (27.63 KB, 下载次数: 0)
下载附件
2023-2-25 18:18 上传
效果展示:
1.png (172.12 KB, 下载次数: 0)
下载附件
2023-2-25 18:16 上传
11.png (168.22 KB, 下载次数: 0)
下载附件
2023-2-25 18:16 上传
2.png (172.26 KB, 下载次数: 0)
下载附件
2023-2-25 18:16 上传