ActionScript入门数学

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

  在日常生活中我们使用的度量角度的单位是度。一个圆周是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θ& lt;=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

  }

  }

我们都知道,横波是一种正弦波,那么我们就要模拟出来一个正弦的波的形状.

  下面说一下它的制作过程及原理.

  原理:使用正弦函数控制每个小球在竖直方向的运动,用复制函数来复制相同的小球在不同的水平位置.

  制作过程:

  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

  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

  //从这里可以看出它接受的是一个弧度而不是角度.

  //原理:利用三角函数,控制正多边形的节点位置,利用绘图函数绘制图像.

  function drawd(n,long){ //自定义绘制函数,有两个参数,n为绘制的边数,long为绘制多边形的边长

  clear()//清屏

  var xarray=new Array() //定义一个数组,用来存储接点的位置坐标

  var yarray=new Array()

  centerx=Stage.width/2 //定义绘制中心

  centery=Stage.height/2 Pi=Math.PI step=360/n//计算每一边对应的角度

  jiao=step*Pi/180 //转换为弧度

  tempjiao=jiao/2 //除以2,用来计算所需的圆的半径

  radius=0.5*long/Math.sin(tempjiao) //计算圆的半径(如果不知道怎么算,请提出,我再讲)

  if(radius>Stage.height/2){ //如果半径过大,超出了场景,让半径适合场景

  radius=Stage.height/2

  }

  for(i=0;i<n+1;i++){ //计算绘制接点 angel=step*i //每个接点对应的角度

  hudu=angel*Pi/180 //转换为弧度

  x=radius*Math.cos(hudu)+centerx //x坐标

  y=radius*Math.sin(hudu)+centery//y坐标

  xarray=x//存入数组

  yarray=y

  }

  this.moveTo(xarray[0],yarray[0])//初始绘制点

  this.lineStyle(1,0x00ff00,100)//绘制线条样式,可以改变

  for(i=0;i<n+1;i++){ //绘制 this.lineTo(xarray,yarray)

  }

  }

  这是主要的绘制函数,使用这个函数进行控制绘图,当然,也可以把他写为类. 场景中的大家可以这样来设置: 静态文本:边数 边长 开始绘制输入文本两个,一个放在边数的后面,设置变量为n,接受边数;一个放在边长的后面,用来接受边长,设置变量为l 随便做一个按钮,放在"开始绘制"几个字的上面,在按钮上加上如下代码:

  on(release){//点击释放后

  this.drawd(n,l)//开始绘制 n=""//把输入清空 l="" }

  好了,可以测试了~~!

  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 中指定的数字的反余弦值

有些朋友说,看到弧度我就晕。其实这是因为我们对它,还不太熟悉、理解的缘故。以前我们也常说:看到 AS我就晕。通过学习对AS比较熟悉、理解了,也就不那么晕了。为此我想谈谈有关弧度的问题。也许能对有些朋友有一点帮助。

  一、角的两种单位

  “ 弧度”和“度”是度量角大小的两种不同的单位。就像“米”和“市尺”是度量长度大小的两种不同的单位一样。

  在flash里规定:在旋转角度(rotation)里的角,以“度”为单位;而在三角函数里的角要以“弧度”为单位。这个规定是我们首先要记住 的!!!例如:rotation2--是旋转“2度”;sin(π/2)--是大小为“π/2弧度”的角的正弦。

  二、弧度的定义

  所谓“弧度的定义”就是说,1弧度的角大小是怎样规定的?

  我们知道“度”的定义是,“两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时,两条射线的夹角 的大小为1度。(如图1)

  那么,弧度又是怎样定义的呢? 弧度的定义是:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度。(如图2)

  比较一下,度和弧度的这两个定义非常相似。它们的区别,仅在于角所对的弧长大小不同。度的是等于圆周长的360分之一,而弧度的是等于半径。

  简单的说,弧度的定义是,当角所对的弧长等于半径时,角的大小为1弧度。

角所对的弧长是半径的几倍,那么角的大小就是几弧度。

  它们的关系可用下式表示和计算:

  角(弧度)=弧长/半径

  圆的周长是半径的 2π倍,所以一个周角(360度)是 2π弧度。

  半圆的长度是半径的 π倍,所以一个平角(180度)是 π弧度。

  三、度跟弧度之间的换算

  据上所述,一个平角是 π 弧度。

  即 180度=π弧度

  由此可知:

  1度=π/180 弧度 ( ≈0.017453弧度 )

  因此,得到 把度化成弧度的公式:

  弧度=度×π/180

  例如:

  90°=90×π/180 =π/2 弧度

  60°=60×π/180 =π/3 弧度

  45°=45×π/180 =π/4 弧度

  30°=30×π/180 =π/6 弧度

  120°=120×π/180 =2π/3 弧度

  反过来,弧度化成度怎么算?

  因为 π弧度=180°

  所以 1弧度=180°/π (≈57.3°)

  因此,可得到 把弧度化成度的公式:

  度=弧度×180°/π

  例如:

  4π/3 弧度=4π/3 ×180°/π

  = 240°

  也许有些朋友会说,究竟是乘以“π/180 ”,还是“180°/π”很容易搞错。其实你只要记住:π是π弧度,180是180度。我要化成什么单位,就要把有这个单位的放在分子上。也就是说我要化 成弧度,就要把π弧度放在分子上--乘以π/180 。另外,1度比1弧度要小得多,大约只有0.017453弧度(π/180≈0.017453)。所以把度化成弧度后,数字肯定要变小,那么化弧度时一定 是乘以π/180 了。能够这样想一想,就不会搞错了。

  在AS代码里把“π”写成“PI”。又因为“π”、“sin”都是“数学函数”,按规定要在前面加上“Math.”(Math是英语中“数 学”Mathematics的缩写),加上后写成“Math.PI”、“Math.sin”。

  所以 sin30°就得写成 Math.sin(30*Math.PI/180)。其中小括弧内的部分是把30°化为弧度,即30×π/180 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值