转 第三章 三角学应用(3)(as3.0)
来源:互联网 发布:php cdn缓存 编辑:程序博客网 时间:2024/06/07 15:09
圆和椭圆
目前为止我们已经掌握了正弦波,下面再来看看它的兄弟,余弦波。与正弦波的形成相
同,只不过是使用余弦函数代替了正弦函数而已。 如果你还记得前面所说的正弦和余弦是怎
样一种相反关系的话,就能理解,它们只是波形都相同,只是所处位置不同了。图 3-19 为
余弦波图像:
图 3-19 余弦波形
可见,余弦图像中 0 度和 2pi 度(或 360 度)的值都为 1,从 1 开始经过 0,-1,0, 最后
回到 1。所以,它与正弦曲线相同,只不过位置发生了一点偏移。
圆形运动
在执行物体移动的动画时,完全可以使用余弦来代替正弦。实际上,余弦和正弦协同工
作时,才能形成一个更加有用的功能:使物体沿圆形运动,如图 3-20。
图 3-20 物体沿圆形运动时的几个点
如图 3-20 所示,以图中的圆为例,盯住右侧的那直角条边(y),然后开始对它进行旋转,
我们发现这条边正在被倒置。 这条边的中心点就是圆心,而它的运动范围就是这个圆的半径。
就像在第一个正弦实验中一样,我们可以计算出这条边的长度:角的正弦值乘以半径。在这
里,使用正弦函数非常合适,当我们从侧面观察这个圆时,就可以算出 y 的长度——对边
的长度。如果把这个圆放倒,再来观察它,发现角是在向前向后或向左向右移动的。这时,
可以使用余弦函数计算出 x 的长度——邻边的长度。重要的一点是,两个的夹角都是相同
的, 而不像 Random.as 那个例子中使用不同的角度计算 x,y 坐标。 这里我们只需要记住用
正弦函数计算 y ,用余弦函数计算 x。下面请看 ActionScript 代码:
package {
import flash.display.Sprite;
import flash.events.Event;
public class Circle extends Sprite {
private var ball:Ball;
private var angle:Number = 0;
private var centerX:Number = 200;
private var centerY:Number = 200;
private var radius:Number = 50;
private var speed:Number = .1;
public function Circle() {
init();
}
private function init():void {
ball = new Ball();
addChild(ball);
ball.x = 0;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
ball.x = centerX + Math.cos(angle) * radius;
ball.y = centerY + Math.sin(angle) * radius;
angle += speed;
}
}
}
大家可以自己写这个例子,也可以打开 Circle.as 作为文档类。执行后发现,获得了
一个完美的圆。这段代码的精华就是使用余弦来确定 x 坐标,使用正弦来确定 y 坐标,你
应该对他们的关系非常了解了。在 Flash 中,只要提到 x ,你就应该马上想到余弦,并且
还能联想到 y 使用正弦。请在最后这段代码上多花些时间,它将是 ActionScript 动画工
具箱中最有用的工具之一。
椭圆运动
想要获得一个椭圆该怎么办呢,其实很简单,问题就在于半径。如果让 x 和 y 运动的大
小相同,那么就得到一个圆。如果想得到一个椭圆形,我们只需要在计算 x 和 y 位置时使用
不同的半径值: radiusX 和 radiusY 。从严格的几何观点来看,使用这两个名称实在不怎
么好,但是它们确实非常简单易懂,也非常好记非常直观,所以我还是坚持使用这两个变量
名。下面看看它们是如何配合的,见 Oval.as:
package {
import flash.display.Sprite;
import flash.events.Event;
public class Oval extends Sprite {
private var ball:Ball;
private var angle:Number = 0;
private var centerX:Number = 200;
private var centerY:Number = 200;
private var radiusX:Number = 200;
private var radiusY:Number = 100;
private var speed:Number = .1;
public function Oval() {
init();
}
private function init():void {
ball = new Ball();
addChild(ball);
ball.x = 0;
addEventListener(Event.ENTER_FRAME, onEnterFrame);
}
public function onEnterFrame(event:Event):void {
ball.x = centerX + Math.cos(angle) * radiusX;
ball.y = centerY + Math.sin(angle) * radiusY;
angle += speed;
}
}
}
意味着小球在距离 centerX 200 个像素内左右运动。 radiusY
这里, radiusX 为 200,
为 100,意味着小球上下运动的范围只有 100 像素,这样就得到了一个不匀称的圆。
勾股定理
最后,介绍一下勾股定理。虽然并不能算是三角学中正式的一部分,但是它与我们这个
学科还是有一些关系的, 并且还涉及到一个将来会经常使用的公式,所以在这里介绍它非常
合适。
勾股定理是很久以前一个希腊人发明。 这个定理是说 A 的平方 + B 的平方 = C 的平方 ,
听起来好像是儿歌,如果大家之前学过这个定理,那么交流起来效果最好。
深入探讨一下,另一种对该定理的叙述是: 直角三角形的两条直角边的平方和等于斜边
的平方,这句话真正说到点子上了。请看图 3-21 所示直角三角形。