ActionScript3.0 Math类

在flash中,Math类是一个非常常用的类,通过数学计算,可以实现很多非常美妙的效果,我们在这里从最基础的学起,补一补数学知识.

我们先来看看flash中提供的Math类吧:

Math.abs()          计算绝对值。
Math.acos()        计算反余弦值。
Math.asin()        计算反正弦值。
Math.atan() 计算反正切值。
Math.atan2()         计算从 x 坐标轴到点的角度。
Math.ceil()        将数字向上舍入为最接近的整数。
Math.cos()        计算余弦值。
Math.exp() 计算指数值。
Math.floor()        将数字向下舍入为最接近的整数。
Math.log()        计算自然对数。
Math.max() 返回两个整数中较大的一个。
Math.min() 返回两个整数中较小的一个。
Math.pow() 计算 x 的 y 次方。
Math.random() 返回一个 0.0 与 1.0 之间的伪随机数。
Math.round() 四舍五入为最接近的整数。
Math.sin() 计算正弦值。
Math.sqrt() 计算平方根。
Math.tan() 计算正切值。
下面我们就这18个基本的函数,进行具体的说明~!


先说几个简单的,把简单的处理掉~!

1、Math.abs()        计算绝对值公式,那么什么是绝对值呢?这个应该问题不大,我们都知道数字有正数和负数,那么我们计算的结果也就有正有负,通过这个函数,把负数值转换为正数值,而正数值不变.我们可以通过下面语句来验证一下:

x=5

y=-5

x=Math.abs(x)

trace(x)

//输出 5

y=Math.abs(y)

trace(y)

//输出 5

2、Math.ceil() 取得指定的数字或表达式的上限的整数值,也就是比指定的数字大的那个整数值。通过下面一段代码可以验证:

x=5.45
x=Math.ceil(x)
trace(x)         //输出6

注意,对于负数,是绝对值越大,数值越小,所以用Math.ceil()取得的整数值是那一个比数字绝对值小的那个负整数。下面代码可以说明:

x=-5.45
x=Math.ceil(x)
trace(x)//输出-5

3、Math.floor()这个函数和Math.ceil()恰好相反,获得一个数字或表达式的一个下限的整数值,也就获取的整数值是比指定的数字小的那一个整数。注意:负数的取法和Math.ceil()的取法一样,只是取得一个绝对值大的一个整数。下面可以验证:

x=5.45
x=Math.floor(x)
trace(x)//输出5

x=-5.45
x=Math.floor(x)
trace(x)//输出-6

4、Math.round()这个函数所用的方法应该是我们最熟悉的了,四舍五入,取得和一个表达式或者数字最接近的一个整数。我们用一下代码验证一下~!

x=5.45
x=Math.round(x)
trace(x)//输出5

x=-5.45
x=Math.round(x)
trace(x)//输出-5

x=-5.55
x=Math.round(x)
trace(x)//输出-6

但是在这里发现一个要大家注意的问题,如果

x=5.50
x=Math.round(x)
trace(x)//输出6

但是如果x=-5.50

x=-5.50
x=Math.round(x)
trace(x)//输出-5          需要注意一下~!

5、Math.random()         随机函数,获取一个介于0和1之间的一个数字 0<=x<1这样的一个小数位数为 14位的一个小数。使用他,可以获取一些不同位数的一些数字。下面我们使用他和上面我们已经研究过的函数,获取一个随机的四位数。

x=Math.random()
x=10000*x
x=Math.round(x)
trace(x)        //输出为4478

当然,flash还提供了随机函数random(value),他也可以获取一个随机的整数,这个整数介于0和value-1之间的一个整数,关于它的用法,网上有很多很详细的说明,在这里就不再多说了,下面用一段代码来验证一下~!

x=random(5)

trace(x)
//输出为,0,1,2,3,4之中的任意一个值~!

6、Math.max()计算两个数字或者表达式中的最大值,并返回这个值。

x=Math.max(5,4)
trace(x)       //输出为5
x=10
y=20
x=Math.max(x,y)
trace(x) //输出为20

7、Math.min()返回两个数字或者表达式中最小的一个值

x=Math.min(5,4)
trace(x)       //输出为4
x=10
y=20
x=Math.min(x,y)
trace(x) //输出为10

8、Math.pow()参数为x,y使用Math.pow(x,y)计算x的y次方,返回计算的结果。

x=Math.pow(2,3)//计算2的3次方
trace(x) //输出为8
x=3
y=4
z=Math.pow(x,y)//计算x的y次方
trace(z)//输出81

9、Math.sqrt()计算一个数字或者一个表达式的平方根,注意这里的表达式应该是一个大于或者等于0的数字。

x=Math.sqrt(2)//计算2的开方

trace(x) //输出为1.4142135623731
x=3
x=Math.sqrt(x)//计算x的开方
trace(x)//输出1.73205080756888

在学习三角函数之前,我们先来了解一个概念---弧度

在日常生活中我们使用的度量角度的单位是度。一个圆周是360度,但是这个数字是任意规定的。而弧度单位是数学家们定义的测量角度的标准公制单位。 弧度是基于π定义的,π是圆的一种固有属性。计算机编程语言通常在处理角度时都以弧度为单位。flash as的内置Math类,它在计算时都是以弧度为单位。

弧度的定义如下:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角的弧度为1。从下面一个图示我们来看一下:

在这个图中,夹角θ的弧度可以使用这个公式来计算:弧长为s,半径为l,则夹角θ的弧度值就是θ=s/l。
π是一个常量,在flash的as中,用Math.PI来定义,PI的值为3.1415…..我们可以测试一下:

p=Math.PI
trace(p)//输出为:3.14159265358979

那么。如何将度转化为弧度呢?基本的关系是π弧度等于180度比例为π:180。因此2π弧度就等于360度,也就是一个圆周。转换的关系式为:

弧度=度×π/180

在flash as中,我们可以通过这样的函数来进行转换:

function dzhd(angel){       //angel为一个度表示的角度,自定义一个函数dzhd

return angel*(Math.PI/180)

}

我们可以来测试一下这个函数:

function dzhd(angel){
return angel*(Math.PI/180)
}
x=dzhd(180)
trace(x)//输出为3.14159265358979,也就是pi

当然,我们在使用的过程中不一定非要用函数来进行转换,我们可以直接用一个表达式来进行转换,同样是可以的。比如把一个角度angel转换为一个弧度hudu值,可以用下面来表示

hudu=angel*(Math.PI)/180

测试一下:

angel=180
hudu=angel*(Math.PI/180)
trace(hudu)//输出为3.14159265358979,也就是pi

同样,我们也可以把弧度转换为度。弧度值乘以180/π得到角度:

自定义函数:

function hdzd(hudu){

return hudu*(180/Math.PI)

}

测试:

function hdzd(hudu){
return hudu*(180/Math.PI)
}
x=hdzd(1)
trace(x)//输出为57.2957795130823,实际上1弧度对应57.3度。

同样,我们也可以直接用一个表达式来转换而不用函数。angel=hudu*(180/Math.PI)

测试:

hudu=1
angel=hudu*(180/Math.PI)
trace(angel)//同样输出为57.2957795130823,实际上1弧度对应57.3度。

10、三角函数

既然说到三角函数,我们还是要从最基本的做起。我们的三角函数,最初是在直角三角形中形成的,来看一下这个三角形。

直角三角形实际上就是其中的一个角是90度的三角形,也就是有一个角是直角。它的直角处用一个小的正方形来标识。它的三条边,直角边用a、b标记, 最长的一边c称为斜边。整个现代文明可以说都是建立在三角形的基础之上的。直角三角形中三条边和三个角之间的关系是as程序员必备的基础知识。

1、勾股定理

这是一个很远古的公式,可能我们很早就已经了解过了。

a的平方加上b的平方等于c的平方。那么,如果我们想计算c的值,对该方程的两边求平方根就可以了。

对于这个定理,大家先有一个基本的认识,等我们来介绍具体在flash场景中使用的时候,我们再具体的来说一个它的应用。

2、正弦函数:

正弦在数学中是这样来定义的,在直角三角形中,角θ的正弦等于它的对边和斜边之比。

sinθ=对边/斜边

在我们的三角形中,公式可以修改为:

sinθ=b/c

在数学中,关于这个函数有很多计算的项目和应用。我们在这里给大家提两点需要大家注意:

(1)、关于它的取值。

在数学中,θ是一个角度值,所以我们会遇到sin(30),sin(60)等等。而它的计算结果是一个数值,是一个-1<=sinθ<=1大于等于负一而小于等于正一的值。这个值在不同的角度范围有时为正,有时为负,取值如下:

0度<=θ<=180度         sinθ>=0

180度<=θ<=360度 sinθ<=0

这样我们可以利用它来控制一个量在一定的范围内来回变化,而不会超出这个返回。这个在这个函数的图像中也会体现出来。

(2)、关于它的周期性。

三角函数都有周期性。正弦和余弦的周期都是360度,也就是2π。以它为周期,循环变化。也就是经过360度,结果重复一次。

在as中关于正弦函数Math.sin()

在as中计算角度的正弦的语法很简单。

Math.sin(theta)

变量theta是用弧度表示的一个角。下面是一个简单的测试。

x=Math.sin(0)
trace(x)//输出0
x=Math.sin(Math.PI)
trace(x)//输出1.22460635382238e-16       这是因为浮点数是以二进制格式存储的,因此会有一定的误差。这是一个非常接近于0的值
x=90*Math.PI/180 //把90度转换为弧度值
x=Math.sin(x)
trace(x)//输出为1
x=Math.sin(90)//之间计算数字90的正弦值
trace(x)//输出0.893996663600558
//从这里可以看出,flash as接受的是一个弧度值,如果是一个数字,则as会认为它是一个弧度来进行计算

下面是使用flash的绘图函数,绘制一个正弦函数的图
代码如下,加到第一帧就可以了
//使用绘图函数,绘制一个正弦函数的图像。
x0=50 //定义开始绘制的位置。
y0=200
a=100//定义一个初始的振幅,也就是扩大一个,不然sinθ的值小于1,很难看出来。
//我们设计一个动态绘制的过程。
du=0//定义开始绘制的角度
_root.moveTo(x0,y0)       //绘制的初始位置
x=x0 //定义开始绘制的水平位置
_root.onEnterFrame=function(){ //进入帧时,开始绘制
_root.lineStyle(3,0x00ff00,100)       //绘制格式
hudu=Math.PI*du/180 //把角度转换为弧度
x=x+0.5 //水平方向每隔0.5象素,绘制一次
du++ //角度递加,每次加一度
//trace(du),你可以测试一下角度的变化
y=y0-a*Math.sin(hudu)       //绘制的y坐标.在这里为甚么用y0减去这个三角函数值呢?因为三角函数计算出来在小于180度时为一个正值而对于flash的场景来说,上边数值小,下面数值大,为了和数学上的函数图像适应,所以减去.
_root.lineTo(x,y) //绘制
if(du==720){ //如果角度增加到720度,也就是两个循环,重新开始绘制
clear() //清屏
x=x0       //初始化位置
_root.moveTo(x0,y0)
du=0       //角度变为0
}
}