Flash MX 在物理教学中的应用
——透镜成像
我宣布:这将是最后一个光学课件,并且还是讫今为止笔者最用心的一个。为什么?因为这是笔者参评的一篇论文,能不用心吗。可喜的是,该论文还获了个不小不大的奖,请往下看吧———
请大家先看下面的特效图:
用鼠标拖动图中的蜡烛或透镜(甚至可以是刻度尺),用键盘在焦距框内输入不同的焦距,蜡烛通过透镜所成的像(实像或虚像)可按实际的情况作相应变化。
以上效果是如何实现的呢?
首先,我们需要分别制作一个蜡烛和蜡烛像的组件(这是该课件中的主角),并分别命名为:candle、candle1。再制作一个透镜及透镜光心的 组件(透镜组件的第1帧为凸透镜形状,第2帧为凹透镜形状),分别命名为ttj、ball。使candle、candle1、ttj、ball四组件在场 景中处于同一高度。然后在场景左上角做三个文本框,名字分别为uu(显示物距)、vv(显示像距)、jjj(输入焦距)。好,所需的主要组件已完成,下面 我们为各组件加入相应的action。
我们知道:透镜成像时遵循以下定律:
物距(u)和像距(v)都好确定,关键问题就是如何根据物距(u)和焦距(f)计算像距(v),由上式可知:
于是,我们可新建一层,输入以下代码:
第1帧:
fscommand (”fullscreen”, “true”);//全屏显示
fscommand (”allowscale”, “0″);
f = jjj*5;//为使刻度尺上的刻度与输入焦距相符,使输入的jjj变量值扩大5倍。
setProperty (”_root.jdot3″, _x, _root.jdot1._x+2*jjj*5);//“jdot”为图中的“f”和“2f”。
setProperty (”_root.jdot4″, _x, _root.ball._x+(jjj*2*5));
setProperty (”_root.jdot1″, _x, _root.ball._x-jjj*5);
setProperty (”_root.jdot2″, _x, _root.ball._x-(jjj*2*5));
u = _root.ball._x-_root.candle._x;//计算物距(可能为负数)。
u1 = Math.abs ( _root.ball._x-_root.candle._x);//强制物距转化为正数
if (uu<jjj) {
setProperty (”_root.bp”, _visible, 0);//用“bp”(白屏)的有无表示所成像的实、虚。
} else {
setProperty (”_root.bp”, _visible, 1);
}
uu = u1/5;//为了调节刻度尺上的刻度与物距框内的数字吻合,使uu=u1/5。
v = (u1*f)/(u1-f);//根据公式计算像距。
vv = v/5;//对应于物距的变化,使vv=v/5
由于Flash5场景(0,0)座标并不在场景中心,而在左上角,我们在确定像的位置时,是以透镜的中心为标准的,Flash并不会自动地调整像的位置,因此我们还需加入以下的代码以使像的位置分布符合事实。
if (u<-1) {
setProperty (”_root.candle1″, _x, _root.ball._x-v);//根据物距调整像的位置。
setProperty (”_root.candle1″, _yscale, -hh*1.6);//调整像的大小。
setProperty (”_root.candle1″, _visible, 1);
setProperty (”_root.bp”, _x, _root.ball._x-v);//使白屏的位置与像的位置一致
} else if (u>1) {
setProperty (_root.candle1, _x, _root.ball._x+v);//根据物距调整像的位置。
setProperty (_root.candle1, _yscale, hh*1.6);//调整像的大小。
setProperty (”_root.candle1″, _visible, 1);
setProperty (”_root.bp”, _x, _root.ball._x+v);使白屏的位置与像的位置一致
} else {
setProperty (”_root.candle1″, _visible, 0);//当像与透镜重合时,让像不可见。
}
我们知道,当焦距小于0或物距小于焦距时,透镜成的像为虚像,为实现此效果,我们可以继续加入以下代码:
if ((jjj<0) or (uu)<jjj) {
setProperty (_root.bp, _visible, 0);//如果焦距小于0或物距小于焦距,设置白屏不可见。
} else {
setProperty (_root.bp, _visible, 1);
}
if (jjj<0) {
tellTarget (”_root.ttj”) {
gotoAndStop (2);//当焦距小于0时,透镜自动变为凹透镜。
}
} else {
tellTarget (”_root.ttj”) {
gotoAndStop (1);当焦距大于0时,透镜自动变为凸透镜。
}
}
hh = _root.candle1._width*(v/u)*5;//根据物距和像距调整像的大小
通过以上Action的作用,当我们拖动蜡烛运动时,蜡烛所成的像就可以依据现实作相应变化了。(注:上述程序并非单纯根据u、f计算v,还有许多其它功能的实现,笔者在每段重要的程序后都做了相应的注释,大家可以参照理解。)
在实际教学中,我们常通过作图说明透镜成像的原因(即实像是由实际光线汇聚成的,虚像是由非实际光线汇集而成的),如下图:
这如何在该课件中实现呢?我们分别做两条直线,并分别定义为组件,分别命名为:“line”及“line1”(注意设置其中心点在线的一端),新建一层加入以下代码:
第1帧:
setProperty (”_root.ball”, _x, _root.ttj._x);//“ball”为一新建组件,属性为“不可见”,将它作为透镜的光心
setProperty (”_root.gjz”, _x, _root.ttj._x);//“gjz”为“光具座”的简称,对应图中的刻度尺,该刻度尺的中心在“0”处。
setProperty (”_root.zgz”, _x, _root.ttj._x);//“zgz”为组件“主光轴”,在图中显示为一条虚线。
setProperty (_root.line, _x, _root.ball._x);//“line”、“line1”为过光心的入射光线。
setProperty (_root.line, _y, _root.ball._y);
setProperty (_root.line1, _x, _root.ball._x);
setProperty (_root.line1, _y, _root.ball._y);
angle = Math.atan (30/u)*180/Math.PI;//根据蜡烛高及物距确定入射光线及折射光线旋转的角度及长短的变化
if (u<0) {
setProperty (_root.line1, _xscale, -v/1.55);
} else if (u>0) {
setProperty (_root.line1, _xscale, v/1.55);
}
if (_root.line1._xscale>=1000) {
setProperty (_root.line1, _xscale, 1000);
}
if (_root.line1._xscale<=-1000) {
setProperty (_root.line1, _xscale, -1000);
}
scale = _root.line1._xscale;
setProperty (_root.line, _xscale, u/1.6);
setProperty (_root.line, _rotation, angle);
setProperty (_root.line1, _rotation, angle);
这一部分很好理解,其中的意思自己去体会吧!
为了使该课件使用起来更方便,我们还可以借助Flash MX强大的编程功能加上自动演示、表格数据处理等功能,在此不再赘述。
需要特别指出的是,在实际调拭程序的过程中,并不能保证课件效果随时随我们的思想改变而改变,也许我们会遇到各种各样甚至奇怪的问题,这时侯我们需 要的冷静与耐心,要知道:实现同一种效果的方法不仅一种,当一种方法行不通时,我们可以尝试另一种方法,问题往往会迎刃而解。如:在该课件的实现过程中, 笔者很为白屏的有无费了一番脑筋,因为在使用“setProperty (”_root.bp”, _visible, 0);”语句时存在冲突,当想隐藏白屏时总也隐藏不了,在这种情况下,笔者想到了将白屏的位置设置到场景外,测试时的效果与当初的想法一样。