[转帖]as入门之数学函数

      我的收藏 2005-7-13 11:32
[闪吧帖]as入门之数学函数 [2004-12-18]
shideng 发表在 flash学习
----------------------------------------------------------------

[转帖][推荐][分享] 恶补数学了,要补的快来~~as入门之数学函数
经典好贴,转帖加1。
我到论坛收索了,这么好的贴居然没有人转发,哎,,,
首先,要真诚感谢的是(来自闪客天堂)的“浪子啸天老师”

真是个时刻想着育人好教师,T_T(敬重)
最近总用一些朋友问起一些数学公式,说这些内容不会,所以在这里开一个基础教程,希望能够对大家的学习提供帮助.
在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的绘图函数,绘制一个正弦函数的图


点击浏览该文件
www.flash8.net/bbs/UploadFile/2004-11/20041122192742660.swf
代码如下,加到第一帧就可以了
//使用绘图函数,绘制一个正弦函数的图像。
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
}
}
我们都知道,横波是一种正弦波,那么我们就要模拟出来一个正弦的波的形状.
先看一下效果.

点击浏览该文件
www.flash8.net/bbs/UploadFile/2004-11/200411221927721.swf
下面说一下它的制作过程及原理.
原理:使用正弦函数控制每个小球在竖直方向的运动,用复制函数来复制相同的小球在不同的水平位置.
制作过程:
1、先做一个小球,我们可以用线性渐变,做一个有一定立体感的小球。转换为mc
2、新建一个mc,命名为ss,把刚才做好的小球mc拖入场景,调整它的位置到正中间。在小球mc上加上如下代码:
onClipEvent(load){ //小球载入时
PI=math.PI //定义数学PI为数学PI
}
onClipEvent(enterFrame){ //进入帧时
_y=-50*math.sin(t*PI/20) //设定小球的y坐标随着角度的变化而变化,实际就是控制它的y坐标在-50到50之间变化
t++//角度递增
}
//这样实现的效果是,小球在初始的位置开始,以这个点为平衡位置,上下不停的往复运动.
3、回到主场景,建立一个坐标系,记下坐标系原点的位置,也就是两个轴交点的坐标。
4、把mc ss拖入主场景,取实例名为ss,把ss放在坐标轴的原点,也就是那个交点上。如果无法调整好,可以通过坐标来设定。
5、在第一帧上写下如下代码:
i=1 //定义复制的初始值
onenterframe=function(){ //进入帧时
if (i<60){ //复制小球的个数为60个
duplicateMovieClip("ss","ss"+i,i); //复制
setProperty("ss"+i,_x,ss._x+8*i); //设置每个小球的位置依次递增
}
i++; //递加
}
//关于复制函数,在这里我们不作讨论.好了,大功告成。还等什么,ctrl+enter测试吧,看看做的怎么样~~~
后记,当然,你也可以加上一些控制按钮,来控制它的播放,自己试一试吧~~
3、余弦函数
余弦函数和正弦函数差不多,我们来看一下:
余弦在数学中是这样来定义的,在直角三角形中,角θ的余弦等于它的邻边和斜边之比。
sinθ=邻边/斜边
在我们的直角三角形中,公式可以修改为:
sinθ=a/c
在数学中,它和正弦一样,也有很多应用。
(1)、关于它的取值。
在数学中,θ是一个角度值,所以我们同样会遇到cos(30),cos(60)等等。而它的计算结果是一个数值,是一个-1<=cosθ<=1大于等于负一而小于等于正一的值。这个值在不同的角度范围有时为正,有时为负,取值如下:
0度<=θ<=90度 和 270度<=θ<=360度 sinθ>=0
90度<=θ<=270度 sinθ<=0
还是各占半个周期,半个周期为正,半个周期为负。
这样我们同样可以利用它来控制一个量在一定的范围内来回变化,而不会超出这个返回。这个在这个函数的图像中也会体现出来。
(2)、关于它的周期性。
三角函数都有周期性。正弦和余弦的周期都是360度,也就是2π。以它为周期,循环变化。也就是经过360度,结果重复一次。
(3)、在这里我们提一下他们的变化趋势。
正弦函数和余弦函数是周期性的函数,在数学中他们的单调性(也就是变化规律),不是单调递增或者单调递减,而是在不同的范围内是不相同的。我们来具体看一下:
正弦函数:
0度<=θ<=90度 递增 而且是增加的越来越慢
90度<=θ<=180度 递减 而且是减少的越来越快
180度<=θ<=270度 递增 而且是增加的越来越慢(注意这里指的是数值上的增加,因为在这个范围,结果是一个负值)
270度<=θ<=360度 递减 而且是减少的越来越快(同样这里指的也是数值上的减少)
余弦函数:
0度<=θ<=90度 递减 而且是减少的越来越快
90度<=θ<=180度 递增 而且是增加的越来越慢(同样这里指的是数值上的增加)
180度<=θ<=270度 递减 而且是减少的越来越快(同样这里指的是数值上的减少)
270度<=θ<=360度 递增 而且是增加的越来越慢(同样这里指的是数值上的增加)
从上面我们可以看出,作为正弦和余弦函数,它们的单调区间(范围)是在一个确定的范围之内。而且他们的单调变化也是有一定的特点,利用这一点,我们可以来设置一些mc运动的缓动。
在as中关于余弦函数Math.cos()
在as中计算角度的正弦的语法很简单。
Math.cos(theta)
变量theta是用弧度表示的一个角。下面是一个简单的测试。
x=Math.cos(0)
trace(x)//输出1
x=Math.cos(Math.PI)
trace(x)//输出-1
x=90*Math.PI/180 //把90度转换为弧度值
x=Math.cos(x)
trace(x)//输出为6.12303176911189e-17这是因为浮点数是以二进制格式存储的,因此会有一定的误差。这是一个非常接近于0的值
x=Math.cos(90)//计算数字90的正弦值
trace(x)//输出-0.44807361612917
下面是使用flash的绘图函数,绘制一个余弦函数的图
(待续)







点击浏览该文件
www.flash8.net/bbs/UploadFile/2004-11/20041122193147987.swf
4、正切函数
前面介绍了三角形中的两种比例:决定“高度”的正弦和决定"宽度"的余弦。三角形中的第三个基础的比例是正切,它决定斜率。
(1)、斜率
当一个直线的倾斜角改变时,它的倾斜程度也随之改变。在数学中通过一个“斜率”的比例来描述他的倾斜程度。在数学中它这样定义:斜率等于高度除以宽度。高度是指垂直改变,宽度是指水平改变。于是垂直改变除以水平改变就得到斜率。
斜率=高度/宽度=垂直改变/水平改变
在直角三角形中,斜边c的斜率即b与a的比例:
c的斜率=b/a
(2)给定倾斜角的直线的斜率
斜边c的斜率与夹角θ之间存在某种关系,这种关系可以用正切来表达。角的正切即倾斜角为该角度的直线的斜率。
θ的正切=c的斜率。
(3)正切的正式定义:
角的正切的正式定义为“对边与邻边的比”。
tanθ=对边/邻边
在直角三角形中:
tanθ=b/a
(4)正切的取值:
正切的值有无穷大这样的值,因为我们可以看到tanθ表示的对边与邻边之比,那么如果它的邻边为0,也就是这条直线是一条竖直的直线的话,a的取值为0,那么我们在数学中说,比例式的分母不能为0,当它为0的时候,这个式子的计算结果是无穷大~~。
正切是一个单调增函数,从-90度到90度的范围内是单调递增的。从负无穷大增大到正无穷大。
(5)周期性:
正切函数同样是一个具有周期性的函数,它的周期是180度。每180度,变换一次。
(6)as中的Math.tan()
它的语法为:
Math.tan(angel)
变量angel同样是用弧度表示的角。所以你在输入角度的时候,同样需要把它转换为角度。下面一段代码来测试一下:
x=45// 计算45度的正切值
x=Math.PI*x/180 //转换为弧度
x=Math.tan(x)//计算
trace(x)//输出1
x=Math.tan(45) //计算45弧度的正切值
trace(x)//输出1.61977519054386
//从这里可以看出它接受的是一个弧度而不是角度.
5、反正切
我们可以使用正切操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数将他转换为相应的角度.as中有两个函数可以计算反正切,我们来看一下.
1、as中Math.atan()
Math.atan()接受一个参数:用法如下:
angel=Math.atan(slope)
angel为一个角度的弧度值,slope为直线的斜率,是一个数字,这个数字可以是负的无穷大到正无穷大之间的任何一个值.
不过,利用他进行计算比较复杂.因为他的周期性,一个数字的反正切值不止一个.例如atan(-1)的值可能是45度,也可能是225度.这样就是他的周期性,对于正切函数来说,他的周期是180度,所以两个相差180度的角具有相同的正切和斜率:
tanθ=tan(θ+180)
然而,Math.atan()只能返回一个角度值,因此确定他的角度非常的复杂,而且,90度和270度的正切是无穷大,因为除数为零,我们也是比较难以处理的~!因此我们更多的会采用第二个函数.
2、Math.atan2()
Math.atan2()接受两个参数x和y,方法如下:
angel=Math.atan2(y,x)
x 指定点的 x 坐标的数字。
y 指定点的 y 坐标的数字。
计算出来的结果angel是一个弧度值,也可以表示相对直角三角形对角的角,其中 x 是临边边长,而 y 是对边边长。
下面我们来测试一下这两个函数:
x=Math.atan(1)//计算正切值为1的数字对应的弧度值
trace(x) //输出一个弧度值0.785398163397448
x=180*x/Math.PI//转换为角度值
trace(x) //输出45
x=Math.atan2(7,7)
trace(x)//输出0.785398163397448
x=180*x/Math.PI//转换为角度值
trace(x)//输出45
x=Math.atan2(7,-7)
trace(x)2.35619449019234
x=180*x/Math.PI//转换为角度值
trace(x)135
x=Math.atan2(-7,7)
trace(x)//输出-0.785398163397448
x=180*x/Math.PI//转换为角度值
trace(x)//输出-45
x=Math.atan2(-7,-7)
trace(x)//输出-2.35619449019234
x=180*x/Math.PI//转换为角度值
trace(x)//输出-135
//从这些测试可以看出,通过坐标系的自动调整,我们可以很自由的计算出处于不同象限的位置相对应的角度.
3、计算两点间连线的倾斜角.
这种方法非常的有用.
Math.atan2()函数返回点(x,y)和原点(0,0)之间直线的倾斜角.那么如何计算任意两点间直线的倾斜角呢?只需要将两点x,y坐标分别相减得到一个新的点(x2-x1,y2-y1).然后利用他求出角度就可以了.使用下面的一个转换可以实现计算出两点间连线的夹角.
Math.atan2(y2-y1,x2-x1)
不过这样我们得到的是一个弧度值,在一般情况下我们需要把它转换为一个角度.
下面我们用一段代码来测试一下这样的转换.
//测试,计算点(3,3)和(5,5)构成的连线的夹角
x=Math.atan2(5-3,5-3)
trace(x)//输出0.785398163397448
x=x*180/Math.PI//转换为角度
trace(x)//输出45

6、反正弦和和反余弦
这两个函数并不常用,主要是在知道了某一个角度的正弦或者余弦的时候,计算他的角度值,不过,他返回的同样是一个弧度值,那么在使用的时候需要把他转为角度值。
用法
Math.acos(x)
Math.asin(x)
参数
x 介于 -1.0 到 1.0 之间的数字。
方法;以弧度为单位计算并返回参数 x 中指定的数字的反余弦值。
具体的就不在多说,也不在测试了~~
标签集:TAGS:
回复Comments() 点击Count()

回复Comments

{commentauthor}
{commentauthor}
{commenttime}
{commentnum}
{commentcontent}
作者:
{commentrecontent}