圆和椭圆
同,只不过是使用余弦函数代替了正弦函数而已。 如果你还记得前面所说的正弦和余弦是怎
样一种相反关系的话,就能理解,它们只是波形都相同,只是所处位置不同了。图 3-19 为
余弦波图像:
图 3-19 余弦波形
回到 1。所以,它与正弦曲线相同,只不过位置发生了一点偏移。
圆形运动
作时,才能形成一个更加有用的功能:使物体沿圆形运动,如图 3-20。
图 3-20 物体沿圆形运动时的几个点
我们发现这条边正在被倒置。
就像在第一个正弦实验中一样,我们可以计算出这条边的长度:角的正弦值乘以半径。在这
里,使用正弦函数非常合适,当我们从侧面观察这个圆时,就可以算出 y 的长度——对边
的长度。如果把这个圆放倒,再来观察它,发现角是在向前向后或向左向右移动的。这时,
可以使用余弦函数计算出 x 的长度——邻边的长度。重要的一点是,两个的夹角都是相同
的,
正弦函数计算 y ,用余弦函数计算 x。下面请看 ActionScript 代码:
package {
}
一个完美的圆。这段代码的精华就是使用余弦来确定 x 坐标,使用正弦来确定 y 坐标,你
应该对他们的关系非常了解了。在 Flash 中,只要提到 x ,你就应该马上想到余弦,并且
还能联想到 y 使用正弦。请在最后这段代码上多花些时间,它将是 ActionScript 动画工
具箱中最有用的工具之一。
椭圆运动
小相同,那么就得到一个圆。如果想得到一个椭圆形,我们只需要在计算 x 和 y 位置时使用
不同的半径值: radiusX 和 radiusY 。从严格的几何观点来看,使用这两个名称实在不怎
么好,但是它们确实非常简单易懂,也非常好记非常直观,所以我还是坚持使用这两个变量
名。下面看看它们是如何配合的,见 Oval.as:
package {
}
为 100,意味着小球上下运动的范围只有 100 像素,这样就得到了一个不匀称的圆。
勾股定理
学科还是有一些关系的,
合适。
听起来好像是儿歌,如果大家之前学过这个定理,那么交流起来效果最好。
的平方,这句话真正说到点子上了。请看图 3-21 所示直角三角形。
两条直角边 A 和 B 长度为 3 和 4,斜边 C 长度为 5。毕达哥拉斯(Pythagoras)先生告诉我们 A
+ B = C 。加入一些数字来检验一下,3 + 4 = 5 ,计算出 9 + 16 = 25。是的,非常正
确。
其中两条边的长度,那么勾股定理就派上用场了,可以用它很快地求出第三条边的长度。在
Flash 中,最常见的情况是我们只知道两条直角边的长度要求出斜边的长度。比如,求出两
点间的距离。
两点间距离
中最为常见的应用。那么如何实现呢?已知两个 Sprite 的 x,y 坐标,把第一个影片的位
置称为 x1,y1,另一个影片的位置称为 x2,y2。
而那条距离线(distance)就是三角形的斜边。在图 3-23 中,加入了这个三角形并填入了数
字。
50 = 8,同样,用 y2-y1 等于 6 得到 dy 的值。现在使用勾股定理,将 dx,dy 的平方相加,
就得到了距离(distance)的平方。
过开平方把它转化为 = dist。这样一来,就可以得出两个影片之间的距离为 10。
公式了。有两个位置 x1,y1 和 x2,y2,先计算出 x 的距离和 y 的距离,然后求出它们的
平方和,最后求出平方根,下面请看 ActionScript 写法:
dx = x2 – x1;
dy = y2 – y1;
dist = Math.sqrt(dx*dx + dy*dy);
轴上的距离。最后一句分为三个步骤:计算每个值的平方,把它们相加,求出平方根。下面
进行一下实践,文档类 Distance.as ,创建了两个 Sprite 影片,并随机摆放,最后计算
出它们之间的距离。
package {
}
不同。不论它们处于什么位置,我们所获得的距离都是正数。有趣吧,但是还不够动态
下面这个示例,可以实时地获得影片的距离,请试一下这个文档类,MouseDistance.as
package {
}
个文本框中进行显示,
将所有这些代码放到处理函数 onMouseMove 中,每次鼠标移动时进行刷新。测试一下这个
文件,并移动鼠标,鼠标与影片剪辑之间会连接上一条线,并实时读取线的长度。
在着先天不足,然后会看到使用勾股定理公式完成基于距离(distance-based)碰撞检测方
法。它还非常适合用于计算重力或弹力等,因为这些力的大小与两个物体之间的距离成正比。
本章重要公式
现在我们已经有了一个全新的工具箱,同时又多了不少工具,全部所有的工具将会在第 19
章列出,那么让我们看看现在都有了哪些工具。注意,这些公式非常地抽象和简化,里面不
包括数据类型和变量定义,在类中使用这些公式时,是否使用这些给出的句型取决于你。
基本三角函数的计算:
角的正弦值 = 对边 / 斜边
角的余弦值 = 邻边 / 斜边
角的正切值 = 对边 / 邻边
角度制与弧度制的相互转换:
弧度 = 角度 * Math.PI / 180
角度 = 弧度 * 180 / Math.PI
向鼠标旋转(或向某点旋转):
// substitute mouseX, mouseY with the x, y point to rotate to
dx = mouseX - sprite.x;
dy = mouseY - sprite.y;
sprite.rotation = Math.atan2(dy, dx) * 180 / Math.PI;
创建波形:
// assign value to x, y or other property of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
value = center + Math.sin(angle) * range;
angle += speed;
}
创建圆形:
// assign position to x and y of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
xposition = centerX + Math.cos(angle) * radius;
yposition = centerY + Math.sin(angle) * radius;
angle += speed;
}
创建椭圆:
// assign position to x and y of sprite or movie clip,
// use as drawing coordinates, etc.
public function onEnterFrame(event:Event){
xposition = centerX + Math.cos(angle) * radiusX;
yposition = centerY + Math.sin(angle) * radiusY;
angle += speed;
}
计算两点间距离:
// points are x1, y1 and x2, y2
// can be sprite / movie clip positions, mouse coordinates, etc.
dx = x2 – x1;
dy = y2 – y1;
dist = Math.sqrt(dx*dx + dy*dy);
这章知识尤为重要- -物体运动离不开这些基础