背景:
人教版高中八年級《物理》上冊書的重難點章節是第五章《透鏡及其應用》。本章特征之一是概念多,如:透鏡、凸透鏡、凹透鏡;光心、主光軸(主軸)、焦點、焦距(1、2倍焦距);光的會聚與發散,虛像與實像等等。教學與學習難點有光學畫圖,凸透鏡成像的動態規律等,大多數中學生無法解決實際問題。
其中的核心內容(重難點)是第三節《凸透鏡成像的規律》。捉住了規律,非常是動態規律(作光路圖),就容易突破這個難點,能夠容易理解照像機、投影儀(幻燈機)、放大鏡,以及旁邊的斜視墨鏡、顯微鏡、天文望遠鏡、潛望鏡等。
我們先來看幾張PPT:
動態規律:
從以上PPT我們看出,只有把握了凸透鏡成像的規律,能夠理解透鏡成像的虛、實;正、倒;大、小;班主任可以通過演示實驗,在講臺上或則PPT上動漫展示,中學生們記憶規律口訣等。并且課后朋友們依然無法產生內化的知識規律凸透鏡成像規律的光路作圖,也不可能在實驗室里反復折騰。非常是對于物體與透鏡的距離改變時發生的動態規律更難掌握。為此,在2020年12月份,版程序——“凸透鏡的動態規律”首次試驗基本實現動態規律。課后凸透鏡成像規律的光路作圖,朋友們可以在電子白板上自由操作了。
這兒的代碼在V1.7.1RC1.0Mind+中平添了一些療效功能,于8/24/2021完成。
程序功能:
1、固定元素:在屏幕大窗口中展示凸透鏡示意圖(含主光軸、光心、焦點、2倍焦點等);
2、繪制動態元素:鍵盤或觸摸設備隨機點擊凸透鏡右邊任意位置(點擊次數暫設置為20),立刻在此位置畫出代表物體的箭頭形狀、發出兩條特殊光線(平行于主光軸和穿過光心)、相應的兩條折射光線及物體所成的虛像(或實像-帶反射延長線),右上出現相應提示標簽等。為了前后對比,不會擦除已畫動態元素。
編制過程:
步驟1布局窗口大小座標系、畫出固定元素
如:借助.py庫文件功能,勾畫凸透鏡示意圖(含主光軸、光心、焦點、2倍焦點、提示標簽)
步驟2動態元素
動態元素--物體、實像、虛像、光線都同時隨滑鼠的點擊而平添畫出。
物體:(不改變大小)只在主光軸兩側上方水平位置;位置由鍵盤點擊時的X軸位置決定。
虛像:只在主光軸兩側下方位置變化(改變大?。?;關鍵頂點位置由過光心直線與過右焦點直線的兩直線多項式相交之解得到。
實像:只在主光軸兩側上方位置變化(改變大?。煌?。
光線:僅穿過光心的變化。確定光線由物體箭頭頂點與座標原點決定。
以下81、82是核心代碼。
步驟3程序結構
主程序main()
主要完成固定元素勾畫及最后調用下邊兩個子程序。
子程序1:()
勾畫動態對象。
子程序2:()
勾畫動態對象變化時的提示標簽及顯示療效。(這三天的附加功能)
以下代碼附加詳盡注釋
代碼
# 動態規律
# 12/2020 ini
# 08/23-24/2021 ok
from graphics import * # 導入庫文件
from random import *
global noteText_loc
noteText_loc = 0
win = GraphWin("凸透鏡成像動態規律",1280,600) # 設置窗口及標題
win.setCoords(-700,-563,1100,281) # 設置相對坐標系
noteText = Text(Point(600,100),'成像規律提示') # 提示標簽
noteText.setTextColor('green')
noteText.setStyle("bold")
noteText.setSize(22)
noteText.draw(win)
################ 定義主函數
def main():
mainAxis = Rectangle(Point(-690,3),Point(1090,-3))
mainAxis.setWidth(1)
mainAxis.setFill("blue")
mainAxis.draw(win)
Text(Point(1000,20),'主光軸').draw(win) # 凸透鏡主光軸標簽
#畫凸透鏡示意圖
triangleUp = Polygon(Point(-20,220),Point(20,220),Point(0,250))
triangleUp.setFill("cyan")
triangleUp.draw(win)
triangleDown = Polygon(Point(-20,-220),Point(20,-220),Point(0,-250))
triangleDown.setFill("cyan")
triangleDown.draw(win)
lens = Rectangle(Point(-5,-222),Point(5,220))
lens.setWidth(0)
lens.setFill("CYAN")
lens.draw(win)
Text(Point(0,-270),'凸透鏡').draw(win) # 凸透鏡標簽
fdotC = Circle(Point(0,0),8) # 畫光心
fdotC.setWidth(1)
fdotC.setFill("yellow")
fdotC.draw(win)
Text(Point(0,-30),'光心').draw(win) # 光心標簽
fdotL = Circle(Point(-150,0),10) # 畫左焦點
fdotL.setFill("yellow")
Text(Point(-150,-30),'F').draw(win) # 一倍焦距左標簽
fdotL.draw(win)
fdotR = Circle(Point(150,0),10) # 畫右焦點
fdotR.setFill("yellow")
Text(Point(150,30),'F').draw(win) # 一倍焦距右標簽
fdotR.draw(win)
fdotL2 = Circle(Point(-300,0),10) # 畫左兩倍焦距點
fdotL2.setFill("yellow")
Text(Point(-300,-30),'2F').draw(win) # 二倍焦距左標簽
fdotL2.draw(win)
fdotR2 = Circle(Point(300,0),10) # 畫右兩倍焦距點
fdotR2.setFill("yellow")
Text(Point(300,30),'2F').draw(win) # 二倍焦距右標簽
fdotR2.draw(win)
for i in range(20): # 設置成像畫圖次數
myobj_ray() #調用成像子函數
display_noteText() #調用提示標簽子函數
################### 定義繪制光線子函數
# 注:待成像的實物必須位于凸透鏡的左邊,所以鼠標點擊右邊無效
def myobj_ray():
global noteText_loc
objX = win.getMouse().getX()
while objX > 0: # 只捕捉鼠標點擊凸透鏡左邊
objX = win.getMouse().getX()
if -310 < objX < -290: # 鼠標點擊在 2F 附近則直接“吸附”為 2F 點
objX = -300
if -160 < objX < -140: # 鼠標點擊在 F 附近則直接“吸附”為 F 點
objX = -149
px = 135/(135/objX+0.9) # (px,py)是兩個直線方程的交點
py = px*135/objX # y = 135 - 0.9x;y = kx(k = 135/objX)
obj = Polygon(Point(objX-7,0),Point(objX+7,0),Point(objX+7,110),
Point(objX+15,110),Point(objX,135),
Point(objX-15,110),Point(objX-7,110)) # 畫實物(固定大小的棕色箭頭)
obj.setFill("brown")
scaleV = py/135
phoVR = Polygon(Point(px-7*scaleV,0),Point(px+7*scaleV,0),
Point(px+7*scaleV,110*scaleV),Point(px+15*scaleV,110*scaleV),
Point(px,py),Point(px-15*scaleV,110*scaleV),
Point(px-7*scaleV,110*scaleV)) # 畫像
if -150 < objX < 0:
phoVR.setFill("yellow")
phoVR.setOutline("yellow") # 如果是放大鏡原理成的虛像用黃色
else:
phoVR.setFill("orange") # 否則成實像用橙色
rayh = Line(Point(objX,135),Point(0,135))
rayh.setWidth(3)
rayh.setArrow("last")
rayh.setFill("red") # 畫來自實物平行主光軸的帶方向的光線
rayf = Line(Point(0,135),Point(150,0))
rayf.setWidth(3)
rayf.setArrow("last")
rayf.setFill("red") # 畫Y軸到X軸的固定光線
rayp = Line(Point(150,0),Point(750,-540))
rayp.setWidth(3)
rayp.setArrow("last")
rayp.setFill("red") # 接上固定光線畫X軸到無線遠的固定光線
rayc = Line(Point(objX,135),Point(0,0))
rayc.setWidth(3)
rayc.setArrow("last")
rayc.setFill("red") # 畫來自實物且穿過光心的帶方向的光線
if -150 < objX < 0: # 虛像(放大鏡原理)
raycc = Line(Point(objX,135),Point(px,py))# 過光心光線反向延長線
raycc.setWidth(3)
raycc.setArrow("none")
raycc.setFill("yellow") # 成虛像的反向延長線用黃色
raycc.draw(win)
raycc = Line(Point(0,0),Point(-px,-py)) # 過光心后的折射光線
raycc.setWidth(3)
raycc.setArrow("last")
raycc.setFill("red")
raycc.draw(win)
raycp = Line(Point(0,135),Point(px,py)) # 平行光折射的反向延長線
raycp.setWidth(3)
raycp.setArrow("none")
raycp.setFill("yellow") # 成虛像的反向延長線用黃色
raycp.draw(win)
else: # 成實像時過光心后的折射光線
raycc = Line(Point(0,0),Point(px,py))
raycc.setWidth(3)
raycc.setArrow("last")
raycc.setFill("red")
raycc.draw(win)
if objX < -10:
obj.draw(win)
phoVR.draw(win)
rayh.draw(win)
rayf.draw(win)
rayp.draw(win)
rayc.draw(win)
noteText_loc = objX
################## 定義更新成像規律提示標簽子程序
def display_noteText():
global noteText_loc
noteText.undraw() # 擦除原提示標簽
noteStr = ''
if -140 < noteText_loc < 0:
noteStr = '放大鏡原理,物體在一倍焦距內成放大的虛像'
elif noteText_loc == -149:
noteStr = '物體剛好在焦點不成像'
elif -300 < noteText_loc < -150:
noteStr = '投影儀原理,物體在一倍兩倍焦距間成放大實像'
elif noteText_loc == -300:
noteStr = '物體剛好在兩倍焦距上成等大實像'
elif noteText_loc < -300:
noteStr = '照相機原理,物體在兩倍焦距外成縮小實像'
noteText.setText(noteStr)
noteText.setSize(randint(16,26))# 隨機改變字體大小、顏色及位置
noteText.setTextColor(color_rgb(randint(0,255),randint(0,255),randint(0,255)))
noteText.move(0,randrange(-10,30,10))
noteText.draw(win) # 重畫新提示標簽
################# 主程序
main()
代碼模式運行
代碼中庫文件.py見附件
此文件置于如下位置:
C:Usersadmin\-py\.6.5-64Lib
附件