Math类三角函数

    技术2022-05-20  37

    Math类三角函数

    转载地址: http://www.poluoluo.com/jzxy/200901/55887.html

    三角函数

    Math类为我们提供了很多数学计算函数,今天我们来了解一下三角函数。三角函数是研究三角形的边与角的关系的学科。希望不要看到这个题目就开跑,不要怕,往下看,你会复习到初中所学的三角课程,同时你会感觉到三角函数会很简单。当然所要介绍的只是正弦,余弦和反正切三个常用的函数。

    Flash为什么要研究三角函数呢?看看下面的图:

    flash坐标体系中(即舞台上),放上一个点a,然后通过a点将a点的x,y长度画出来,并将两条线的端点连起来,你看一个直角三角形出现了。这样三角函数就有研究头了。这个三角形跟这个点有什么关系呢?最明显的就是这个三角形的两条直角边b,c确定了a点的位置。除了两条直角边以外,还有斜边d,还有一个角e, (另外两个角我们不研究)。这些边和角之间的关系就是三角函数。我们说过只研究三个函数: 

    sin(e) = c/d; 对边除以斜边 

    cos(e) = b/d; 邻边除斜边 

    e = atan(c/b) 

    flash为我们提供了一个更为合理的反正切函数:atan2(y,x) 

    即: e = atan2(y,x) 

    从上面的图中可以看出,实际上b就等于点ax,c就等于点ay.这换一下,就成: 

    sin(e)=y/d; 

    cos(e) = x/d; 

    将这两个式子变一下就成: 

    y = d*sin(e); 

    x=d*cos(e); 

    对这两个式子,需要说明的是:角e在三角函数的运行中必须使用弧度制,这与我们习惯的角度制有所不同,所以我们需要记住角度弧度转换的公式: 

    [cose]角度弧度转换公式: 

    角度 弧度*180/Math.PI; 

    弧度 角度*Math.PI/180;[/code] 

    PI是园周率,即3.14159,它属于Math类写法为:Math.PI.三角函数也属于Math类。所以上面的公式正确写法是: 

    x= d*Math.cos(e) e为弧度表示 

    y=d*Math.sin(e) 

    三角函数的知识差不多复习这么多就行了,是不是很简单呢?

    园周运动:

    上面介绍的三角函数有什么用呢?我们还是来看看前面那个图,如果直角三角形的斜边长度固定不变,让角e不断地加大,会是个什么效果呢?很容易理解它出现的是下面的效果:

    a在做园周运动。看起来有点意思了哈。怎样让它做园周动运的呢?要让对象移动需要改变对象的x,y值,上面的公式已经给了我们计算这两个值的方法: 

    x= d*Math.cos(e) 

    y=d*Math.sin(e) 

    做园周运动时直角三角形的斜边长度d不变,其实我们早已看出来了,斜边实际就上园周的半径。将角e不断增大,从而产生不同的x,y值,将这些值赋给点a对象,就形成了园周运动了。在上例中,我们将点a做成MC,实例名称为:ball_mc,h 上例的代码为: 

    var d = 100; //半径为100 

    var centerx = Stage.width/2; 

    var centery = Stage.height/2;确定园心的位置在舞台中心 

    var zl=10;//设一个增量,即角e每次增加10度。 

    var i=1; 

    onEnterFrame =function(){ 

    ball_mc._x=centerx+d*Math.cos(i*zl*Math.PI/180);//再次提醒三角函数要用弧度 

    ball_mc._y =centery+d*Math.sin(i*zl*Math.PI/180); 

    i++; 

    if(i>36){//这个条件语句可以不要,但那样i会无限度增大,我觉得不好,所以在i>36时,即转完1周时,让i=1。 

    i=1; 

    上面已经完成了三角函数的第一个应用:园周运动。

    园周运动公式: 

    MC._x = 园心x+半径*Math.cos(i*增量*Math.PI/180); 

    MC._y = 园心x+半径*Math.sin(i*增量*Math.PI/180); 

    i++;

     

    你非常高兴,因为你已经会让对象做园周运动了,你很快就想到了要做一个月亮围绕地球运转的效果。但问题出现了,月亮的运轨迹好象是椭园的。不要作急,我们来比较一下园和椭园的区别,很快我们发现椭园与园的区别就是x轴半径和y轴的半径不相等。于是乎,椭园运动公式出来了。

    椭园运动公式: 

    MC._x = 园心x+x轴半径*Math.cos(i*增量*Math.PI/180); 

    MC._y = 园心x+y轴半径*Math.sin(i*增量*Math.PI/180); 

    i++; 

    恭喜,你现在连椭园运动都会了。我们再来研究一下,看看三角函数还能搞点什么名堂。

    上面说过,要研究三个三角函数,上面只用了两个,好象还有个flash专用的反正切函数:atan2.这个函数是根据某点的x,y值计算出该点与x轴之间的角度: 

    e = Math.atan2(y,x); 

    能不能算出两点之间的角度偏差呢?还是来看看图:

    在图中有两个点ab,将两个点用一根线连起来,通过a点作y轴平行线,通过b点作x轴平行线,这样三根线就组成了一个直角三角形。有了三角形就好办了,我们的三角函数就该上场了。先来分析一下这个直三角形,不难看出,三角形的两条直角边实际就是两点的坐标差,分别是:(x1-x2)和(y1-y2.而角e就是是两点间的角度差。有了角度差,就想如果将b点旋转一个角差,那么b点的方向就与a点一样了。如果将a点换为鼠标,在鼠标移动时始终计算b点与鼠标的角差,然后让b点旋转这个角差,这样b点会一直指向鼠标跑都跑不脱。效果如下:

    代码: 

    onEnterFrame = function(){ 

    var dx = _xmouse - jt_mc._x; 

    var dy = _ymouse - jt_mc._y; 

    var angle = Math.atan2(dy,dx)*180/Math.PI; 

    jt_mc._rotation = angle; 

    }

    跟随鼠标旋转公式: 

    onEnterFrame = function(){ 

    var dx = _xmouse - MC._x; 

    var dy = _ymouse - MC._y; 

    var angle = Math.atan2(dy,dx)*180/Math.PI; 

    MC._rotation = angle; 

    这里要注意两点:1. atan2(dy,dx)dy在前,dx在后,这一点容易搞错。2.atan2()计算出的角度是弧度,而我们要设置_rotation属性要用角度,所以要用180/Math.PI;弧度转为角度。硬是妖怪得很,一会转过去,一会转过来。

    现在你又想出了新花样了,光是跟着鼠标转还不行,还跑过去抓住它。还是看上面那个图,b点要到a点,是不是b点的x加上(x1-x2, b点的y加上(y1-y2)就行了呢。但即然是跟跟随肯定不能一步到位,要不就不是跟随了,而是帖在一起了,也就是说趋于直角三角形的斜边一能一步到位,而是一点一点地增加,这就需在设一个增量。根据前面的三角函数公式就可算出每次增加的xy的量了。 

    vx = 增量*Math.cos(e); 

    vy = 增量*Math.sin(e); 

    b点的x,y不停地加上这个vx,vyb点就不停地向a点靠近了。 

    代码: 

    var speed = 3; 

    onEnterFrame = function(){ 

    var dx = _xmouse - jt_mc._x; 

    var dy = _ymouse - jt_mc._y; 

    var angle = Math.atan2(dy,dx)*180/Math.PI; 

    jt_mc._rotation = angle; 

    jt_mc._x += speed*Math.cos(angle); 

    jt_mc._y += speed*Math.sin(angle); 

    }

    鼠标跟随公式: 

    var speed = 一个数字

    onEnterFrame = function(){ 

    var dx = _xmouse - MC._x; 

    var dy = _ymouse - MC._y; 

    var angle = Math.atan2(dy,dx)*180/Math.PI; 

    MC._rotation = angle; 

    MC._x += speed*Math.cos(angle); 

    MC._y += speed*Math.sin(angle); 


    最新回复(0)