1. 引言
采用Flash制作多媒体课件,可以制作具有交互功能的高品质的多媒体课件 [1]。Flash提供了ActionScript语言 [2],使用该语言可以实现各种复杂的功能。“信号与系统”课程有大量的数学公式,要制作信号与系统课程的课件首先要解决如何描述函数与函数图像。如果函数图像只是采用Flash工具手工绘制而成,那么这个图像与函数就没有关系。当需要改变该图像的取值范围、线的粗细、背景等,只有重新一张一张绘制了。因此很多数学课件开发者需要一个通用的数学引擎 [3],只要改变函数就可以改变图像,同时还能够修改横纵坐标的取值范围、线的颜色、粗细、背景等,本文将描述一种用Flash开发的数学函数引擎来实现上述目标。
2. 多媒体课件中的函数
在信号与系统中信号实际上就是自变量为时间变化的函数,即信号可以用函数f(x)来表达。因此信号与函数是同一个概念。一个普通的信号f(x)可以通过变换形成下面的式子:
其中f是函数名,x是自变量,a,b,c分别是参数。例如一个简单的正弦函数可以描述为:
其中A,ω,θ分别是振幅,角频率和相位。
一般课件中需要观察函数图像随着a,b,c的改变而变化的过程。有时候还需要改变函数名,这就需要有一个函数引擎来支持,这个函数引擎具有很强的通用性。如图1是描述正弦波的一个例子,通过改变振幅,角频率,相位来观察图像的变化。
Figure 1. Mathematical functions in Multimedia
图1. 多媒体中的数学函数
很显然采用传统的Flash手工绘制的方法是很困难的,更不用说要实现交互式了。采用数学函数引擎实现上述动画就容易多了。
3. 数学函数引擎的制作
为了可移植性更好,需要将数学函数引擎的代码放置在单独的Flash文件中,在Flash CS5中,采用Action Script 3.0程序,新建一个信号类,命名为Signal.as,在该文件中编写如下代码:
package
{
public final class Signal
{
public var a,b,c:Number;
public var name:String;
public function Fun(name:String=,a:Number=1,b:Number=1,c:Number=0)
{
this.a=a;
this.b=b;
this.c=c;
this.name=name;
}
//定义f(x)
public function f(x:Number):Number
{
return a*this[name](b*x+c);
}
//正弦函数
public function sin(x:Number):Number
{
return Math.sin(x);
}
//分段函数
public function seg(x:Number):Number
{
return x>=0&&x<=1?x:0
}
}
}
代码中this[name]是一种特殊的用法,其中name是字符串,用这种方法可以将字符串转换为函数名,例如this[“sin”]调用的是正弦函数,this[“seg”]调用了分段函数。也就是说本来是sin(x),现在写成了this[“sin”](x),这样就可以通过改变字符串来改变函数了。注意本例中提供了两个函数,一个是sin,另一个是seg,这两个函数都是用户自己定义的,如果用户还需要更多的函数可以按例子中的方法补充即可。
4. 通用函数图像类
按照上述的方法再建立一个Curve.as的文件,该文件用来生成函数图像。其部分代码如下:
package
{
public class Curve extends Sprite
{
public var w, h, x1, x2, y1, y2, xn, yn: Number;
public var f;
public function draw_curve():void
{
//代码略.....
}
......
}
}
其中w,h是图像的宽高,x1,x2是横轴的左右端点值,y1,y2是纵轴下和上的取值范围,xn,yn是横纵坐标的刻度份数。这里最值得注意的是变量f,给它赋不同的值,函数图像就会改变。
5. 数学引擎的使用
有了Signal.as和Curve.as两个文件,建立一个新的文件,后缀名是.fla。在这个文件的第一帧编写代码,如下:
var A=1; var ω=1; var θ=0;
var cv=new Curve();
addChild(cv);
cv.x1=−6; cv.x2=6; cv.y1=−2; cv.y2=2; cv.xn=12; cv.yn=4;
cv.w=200; cv.h=150;
var myfun=new Singal(sin,A,ω,θ);
cv.f=myfun.f;
cv.draw_curve();
所得函数图像,如图1所示。如果将代码中,加粗的语句改写为var myfun=new Signal(seg,A,ω,θ);则得到分段函数图像如图2所示。
至于右边的滑杆控件,只要将它们的值关联到程序中的A,ω,θ即可。
6. 结论
在多媒体的开发实践中,使用该Flash数学引擎简化了数学函数图像的编写,用户可以在此基础上开发更为强大、功能更多的数学引擎,它将使关于数学多媒体课件的内容更加丰富,用户体验更加友好。
基金项目
沈阳化工大学教育教学培育工程项目资助。
NOTES
*通讯作者。