第四章.数字和数学
第 1 页 共 23 页
第四章.数字和数学
4.0. 简介
4.1.数字的不同表现形式
4.2.不同数字类型之间的转换
4.3.四舍五入
4.4.格式化输出
4.5.不使用掩码进行数字格式化
4.6.格式化货币数字
4.7.生成随机数
4.8.模拟硬币投掷
4.9.模拟骰子
4.10.产生唯一的随机数
4.11.转换角度计算
4.12.计算两点之间的距离
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 2 页 共 23 页
4.0. 简介
数字的用法非常广泛,有多种表示形式,如十进制,十六进制,每种表示都有其特定用处,比如,
十六进制经常来表示 RGB 颜色值。(看4.2关于如何在各种表示法之间进行转换)。
数字和数学紧密相关,没有数学运算,Flash 将非常迟钝。像加法和减法等简单运算在ActionScript
经常用到,还有些运算,如随机数生成也是很常用的。
ActionScript 3.0 有三种基本数字类型: number, int, 和 uint。 number 对应浮点数, int 和 uint
对应整数。 int 和 uint 的区别就是uint 代表无符号整数。
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 3 页 共 23 页
4.1. 数字的不同表现形式
问题
我要指定数字为十进制,八进制或十六进制
解决办法
十六进制以0x开头,八进制以0开头,二进制不能直接表示,可以用等价的八进制或十六进制或用
parseInt( ) 函数转换字符为数字。
讨论
ActionScript 中各种格式使用是很方便的。比如,如果你要设置Sprite.rotation 属性,最好是用十
进制数:
rectangleSprite.rotation = 180;
另一方面,十六进制经常表示 RGB 颜色。例如,给 ColorTransform 对象的rgb 属性使用十六进
制数:
var pink:ColorTransform = new ColorTransform( );
pink.rgb = 0xF612AB;
0X 或0x开头的数字为十六进制数,十六进制有0到9和A 到F 字符组成,没有大小写之分。
0 开头的数字为八进制,有0 到7 组成;例如,0777 是个八进制数。大多数开发者不怎么使用八进
制,基本上都是使用十进制,除了颜色值用十六进制表示。
二进制只有0和1组成,虽然不能直接表示它,但你可以等效的十六进制来表示它,比如二进制1111
等于十六进制F,11111111 等于FF,二进制数在为操作(&, |, ^, >>, <<, >>>)上经常用。.
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 4 页 共 23 页
4.2. 不同数字类型之间的转换
问题
我要把当前数字类型转换为别的数字类型
解决办法
用parseInt( ) 函数把字符串转换为十进制数,用 Number, uint, 或 int 对象的 toString( ) 方法转换
为字符串。
讨论
在ActionScript 中不管你怎么设置数字,它的内部结果总是以十进制存贮:
// 创建颜色对象
var pink:ColorTransform = new ColorTransform( );
// 用十六进制设置 RGB
pink.rgb = 0xF612AB;
// 显示这个值时:16126635
trace(pink.rgb);
如果你要输出为其他表示法,用 toString( radix ) 方法
下面的例子用构造uint对象,输出不同的格式:
// radix 为 2, 输出二进制
trace(new uint(51).toString(2)); // 显示: 110011
// radix 为 16, 输出十六进制
trace(new uint(25).toString(16)); // 显示:19
var quantity:Number = 164;
trace(quantity.toString(16)); // 显示: a4
下面的例子设置ColorTransform 对象的RGB值,调用 toString( ) 以十六进制显示:
var pink:Color = new ColorTransform( );
pink.rgb = 0xF612AB;
trace(pink.rgb.toString(16)); // 显示:f612ab
toString( ) 方法的参数值的合法范围在2到36,如果没有指定参数值,默认为10。
和 toString( ) 相反的是 parseInt( ) 函数。它把指定的字符串转换为数字。
下面的代码把各种字符串,输出十进制数。
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 5 页 共 23 页
trace(parseInt("110011", 2)); // 显示: 51
trace(parseInt("19", 16)); // 显示: 25
trace(parseInt("17", 10)); // 显示: 17
如果不指定字符串进制,默认为十进制,除非在字符串前加上0x, 0X, 或0:
trace(parseInt("0x12")); // 显示: 18
trace(parseInt("017")); // 显示: 15
下面的例子给出的字符串格式和指定进制冲突,这时会默认为十进制
// 但是下面的字符串是不合法的数字,因此返回0
trace(parseInt("0x12", 10)); // 显示: 0
下面的字符串为八进制,但指定为十进制,因此系统默认字符串为十进制,而不是八进制。
trace(parseInt("017", 10)); // 显示 17
trace(parseInt("A9FC9C")); // NaN
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 6 页 共 23 页
4.3. 四舍五入
问题
我要进行四舍五入或取近似值.
解决办法
用 Math.round( ) 进行四舍五入, Math.floor( ) 和 Math.ceil( ) 进行上下近似值。
NumberUtilities.round( ) 方法可自定义取值。
讨论
很多情况我们需要得到整数部分而不是带有小数的浮点数。比如计算出结果为 3.9999999 ,期望
的结果应该是4.0。
Math.round( ) 方法进行四舍五入计算:
trace(Math.round(204.499)); // 显示: 204
trace(Math.round(401.5)); // 显示: 402
Math.floor( ) 方法去掉小数部分,Math.ceil( ) 方法去掉小数部分后自动加1:
trace(Math.floor(204.99)); // 显示: 204
trace(Math.ceil(401.01)); // 显示: 402
如果我想要把90.337 四舍五入到 90.34,可以这么写:
trace (Math.round(90.337 / .01) * .01); //显示: 9.34
trace (Math.round(92.5 / 5) * 5); // 显示: 95
trace (Math.round(92.5 / 10) * 10); // 显示: 90
更好的办法是用自定义函数NumberUtilities.round( ) ,它需要两个参数:
number :要舍入的数字
roundToInterval :间隔值
NumberUtilities 类在 ascb.util 包中。
imported ascb.util.NumberUtilities导入
trace(NumberUtilities.round(Math.PI)); // Displays: 3
trace(NumberUtilities.round(Math.PI, .01)); // Displays: 3.14
trace(NumberUtilities.round(Math.PI, .0001)); // Displays: 3.1416
trace(NumberUtilities.round(123.456, 1)); // Displays: 123
trace(NumberUtilities.round(123.456, 6)); // Displays: 126
trace(NumberUtilities.round(123.456, .01)); // Displays: 123.46
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 7 页 共 23 页
4.4. 格式化输出
问题
我要把数字进行格式化输出
解决办法
用 NumberFormat 类,设置掩码,然后调用 format( ) 方法。
讨论
经常会遇到需要在输出时在头部和尾部加0或空格来达到格式化输出的目的,比如显示时间或日期。
比如要格式化输出6 小时3 分钟,显示为 6:03 或 06:03,而不是 6:3。而且还经常碰到输出时进
行对齐等,这都需要进行格式化输出:
123456789
1234567
12345
虽然自己都可以做到这种效果,但是你会发现用 NumberFormat 对象更简单更灵活。
NumberFormat 类是个自定义类,可到http://www.rightactionscript.com/ascb 下载。使用它须先导
入:import ascb.util.NumberFormat:
接下来决定是什么掩码进行格式化,它可以是0,#,.,,,或者其他。
零 (0)
使用零作为占位符
井号 (#)
点号(.)
逗号 (,)
下面看一下例子:掩码如下:
##,###.0000
格式化如下数字:1.2345, 12.345, 123.45, 1234.5, 和 12345, 结果:
1.2345
12.3450
123.4500
1,234.5000
12,345.0000
通过构造函数直接传入参数作为掩码:
var styler:NumberFormat = new NumberFormat("##,###.0000");
另外,使用属性进行修改掩码:
styler.mask = "##.00";
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 8 页 共 23 页
设置好掩码,调用 format( ) 方法就可以格式化数字了:
trace(styler.format(12345);
var styler:NumberFormat = new NumberFormat("#,###,###,###");
trace(styler.format(1));
trace(styler.format(12));
trace(styler.format(123));
trace(styler.format(1234));
styler.mask = "#,###,###,###.0000";
trace(styler.format(12345));
trace(styler.format(123456));
trace(styler.format(1234567));
trace(styler.format(12345678));
trace(styler.format(123456789));
输出如下:
1
12
123
1,234
12,345.0000
123,456.0000
1,234,567.0000
12,345,678.0000
123,456,789.0000
NumberFormat 对象自动本地化返回值。如果Flash播放器在英文操作系统上运行, NumberFormat
类是用逗号和点号,如果在法语操作系统上运行,正好相反,使用点号和逗号,因此需要覆盖自动
本地化:
有几种方法覆盖自动本地化设置:
把Locale 对象作为format( ) 方法的第二个参数,format( ) 方法根据Locale 对象的设置进行格式
化。Locale 对象使用两个参数,第一个是语言代码,如en,第二个参数为国家代码,如EN.
通过全局设置Locale.slanguage 或 Locale.svariant 属性就不需要给format( ) 方法传递参数了
使用符号对象作为format( )的第二个参数,包括两个属性:group 和decimal。该方法适合没有用
Locale对象进行全局设置下使用。
Locale 类在 ascb.util 包中,使用前导入。
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 9 页 共 23 页
下面的代码展示了三种方法:
var styler:NumberFormat = new NumberFormat("#,###,###,###.00");
Locale.slanguage = "fr";
trace(styler.format(1234));
trace(styler.format(12345, {group: ",", decimal: "."}));
trace(styler.format(123456));
Locale.slanguage = "en";
trace(styler.format(1234567));
trace(styler.format(12345678, new Locale("es", "ES")));
trace(styler.format(123456789, {group: "|", decimal: ","}));
结果:
1.234,00
12,345.00
123.456,00
1,234,567.00
12.345.678,00
123|456|789,00
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 10 页 共 23 页
4.5. 不使用掩码进行数字格式化
问题
我不想使用掩码进行格式化
解决办法
用 NumberFormat 对象不设置掩码,调用 format( ) 方法
讨论
4.4 节讨论了各种复杂的数字格式化方法,但是能不能不用那么复杂呢,NumberFormat 类提供了
一个简单的办法,只使用最简单的format( )方法:
var styler:NumberFormat = new NumberFormat( );
trace(styler.format(12.3));
trace(styler.format(123.4));
trace(styler.format(1234.5));
trace(styler.format(12345.6));
显示如下:
12.3
123.4
1,234.5
12,345.6
正像上一节所说的,仍然有本地化问题,本地化处理和上一节一样:
var styler:NumberFormat = new NumberFormat( );
Locale.slanguage = "fr";
trace(styler.format(1234, new Locale("en")));
trace(styler.format(12345, {group: ":", decimal: "|"}));
trace(styler.format(123456));
输出:
1,234
12:345
123.456
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 11 页 共 23 页
4.6. 格式化货币数字
问题
我要格式化货币,比如美元
解决办法
使用 NumberFormat.currencyFormat( ) 方法
讨论
不像其他语言,比如ColdFusion,ActionScript 没有提供内建的函数格式化货币数字。自定义类
NumberFormat 包括一个currencyFormat( )方法。
currencyFormat( ) 至少需要一个参数,看下面的简单代码:
var styler:NumberFormat = new NumberFormat( );
trace(styler.currencyFormat(123456));
在英文操作系统上运行结果如下:
$123,456.00
和 format( ) 方法类似,currencyFormat( ) 方法根据自动本地化设置进行格式化。因此,如果上面
的代码在西班牙语操作系统上运行结果如下:
123.456,00
覆盖自动本地化方法和format()类似:
使用 Locale 对象作为currencyFormat( )的第二个参数.
赋全局变量给 Locale.slanguage 和 Locale.svariant 属性
使用字符对象作为currencyFormat( )的第二个参数.
currencyFormat( ) 的字符对象比format( ) 方法中稍微不一样,它包括4个属性: group, decimal,
currency, 和 before。group 和 decimal 属性和 format( ) 方法一样。currency 属性为货币符号,
before 为布尔值,表示货币符号的位置。
下面是currencyFormat( )的一些例子代码:
var styler:NumberFormat = new NumberFormat( );
trace(styler.currencyFormat(123456));
Locale.slanguage = "nl";
trace(styler.currencyFormat(123456));
trace(styler.currencyFormat(123456, new Locale("sv")));
trace(styler.currencyFormat(123456, {group: ",", decimal: ".", currency: "@", before: false}));
输出结果:
$123,456.00
123.456,00
123,456.00kr
123,456.00@
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 12 页 共 23 页
4.7. 生成随机数
问题
我要生成随机数
解决办法
使用Math.random( ) 方法生成 0 到 .999999的随机数。还有,是用NumberUtilities.random( ) 方
法可以生成指定范围的随机数
讨论
Math.random( ) 方法产生 0 到 0.999999999的浮点随机数。大多数情况我们希望产生整数而不是
浮点数,还好随机值可以指定精度。
NumberUtilities.random( ) 方法产生指定的范围和精度,它接受三个参数:
minimum
可接受的最小值
maximum
可接受的最大值
roundToInterval
间隔值,可选
NumberUtilities 类在 ascb.util 包中,使用前导入。
例子如下:
// 产生 0 到 100的整数.
trace(NumberUtilities.random(0, 100));
// 产生 0 到 100的整数,间隔为5
trace(NumberUtilities.random(0, 100, 5));
trace(NumberUtilities.random(-10, 10, .1));
trace(NumberUtilities.random(-1, 1, .05));
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 13 页 共 23 页
package {
import flash.display.Sprite;
import ascb.util.NumberUtilities;
import flash.utils.Timer;
import flash.events.TimerEvent;
public class RandomNumberTest extends Sprite {
private var _total:uint;
private var _numbers:Object
public function RandomNumberTest( ) {
var timer:Timer = new Timer(10);
timer.addEventListener(TimerEvent.TIMER, randomizer);
timer.start( );
_total = 0;
_numbers = new Object( );
}
private function randomizer(event:TimerEvent):void {
var randomNumber:Number = NumberUtilities.random(1, 10, 1);
_total++;
if(_numbers[randomNumber] == undefined) {
_numbers[randomNumber] = 0;
}
_numbers[randomNumber]++;
trace("random number: " + randomNumber);
var item:String;
for(item in _numbers) {
trace("\t" + item + ": " + Math.round(100 * _numbers[item]/_total));
}
}
}
}
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 14 页 共 23 页
4.8. 模拟硬币投掷
问题
我要模拟硬币投掷或布尔事件来达到50%几率成功。
解决办法
用NumberUtilities.random( ) 方法产生 0 到 1的整数,根据每种可能得出结果。
讨论
用 random( ) 方法产生指定范围的随机整数,能够产生两个结果对应硬币的正面和反面状态,在程
序里我们用0 代表一个状态,1代表另一状态,当然你用1 和2也是可以的,总之是2 个状态,这
样就能模拟硬币投掷了:
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
import ascb.util.NumberUtilities;
public class CoinExample extends Sprite {
private var _field:TextField;
public function CoinExample( ) {
_field = new TextField( );
_field.autoSize = "left";
addChild(_field);
var circle:Sprite = new Sprite( );
circle.graphics.beginFill(0, 100);
circle.graphics.drawCircle(100, 100, 100);
circle.graphics.endFill( );
circle.addEventListener(MouseEvent.CLICK, onClick);
addChild(circle);
}
private function onClick(event:MouseEvent):void {
var randomNumber:Number = NumberUtilities.random(0, 1);
_field.text = (randomNumber == 0) ? "heads" : "tails";
}
}
}
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 15 页 共 23 页
记录正反面出现次数:
package {
import flash.display.Sprite;
import flash.text.TextField;
import ascb.util.NumberUtilities;
public class CoinTest extends Sprite {
private var _field:TextField;
public function CoinTest( ) {
_field = new TextField( );
_field.autoSize = "left";
addChild(_field);
var heads:Number = 0;
var tails:Number = 0;
var randomNumber:Number;
for(var i:Number = 0; i < 10000; i++) {
randomNumber = NumberUtilities.random(0, 1);
if(randomNumber == 0) {
heads++;
}
else {
tails++;
}
}
_field.text = "heads: " + heads + ", tails: " + tails;
}
}
}
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 16 页 共 23 页
如果要测试随机数,应该保存在变量中,像上面的代码,下面代码的统计是错误的,因此else if 每
次都产生新的随机数:
package {
import flash.display.Sprite;
import ascb.util.NumberUtilities;
public class RandomLetter extends Sprite {
public function RandomLetter( ) {
for(var i:Number = 0; i < 10000; i++) {
trace(getRandomLetter( ));
}
}
private function getRandomLetter( ):String {
if(NumberUtilities.random(0, 2) == 0) {
return "A";
}
else if(NumberUtilities.random(0, 2) == 1) {
return "B";
}
else if(NumberUtilities.random(0, 2) == 2) {
return "C";
}
// It's possible that none of the preceding will evaluate to true,
// and the method will reach this point without returning a valid
// string.
return "";
}
}
}
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 17 页 共 23 页
下面才正确:
package {
import flash.display.Sprite;
import ascb.util.NumberUtilities;
public class RandomLetter extends Sprite {
public function RandomLetter( ) {
for(var i:uint = 0; i < 10000; i++) {
trace(getRandomLetter( ));
}
}
private function getRandomLetter( ):String {
// random( ) 返回结果到变量上
var randomInteger:uint = NumberUtilities.random(0, 2);
if(randomInteger == 0) {
return "A";
}
else if(randomInteger == 1) {
return "B";
}
else if(randomInteger == 2) {
return "C";
}
return "";
}
}
}
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 18 页 共 23 页
4.9. 模拟骰子
问题
我要模仿掷骰子
解决办法
用NumberUtilities.random( ) 方法产生指定范围的随机数
讨论
用 random( ) 方法产生整数来模拟掷骰子,这在很多游戏中经常用到,这次我们在ActionScript中
实现
一般我们产生随机数然后保存它在使用,如果要重新使用存在的随机数,应保存它而不是再产生新
的随机数。注意下面两种情况,第一种,dice 总是die1和die2的之和:
var die1:uint = NumberUtilities.random(1, 6);
var die2:uint = NumberUtilities.random(1, 6);
var dice:uint = die1 + die2;
下面的情况,dice和die1 和die2 没有关系,换句话说,即使die1和die2加起来等于7,dice也不
会等于它:
var die1:uint = NumberUtilities.random(1, 6);
var die2:uint = NumberUtilities.random(1, 6);
var dice:uint = NumberUtilities.random(1, 6) + NumberUtilities.random(1, 6);
NumberUtilities.random( ) 还可以模拟多边的骰子:
var die1:uint = NumberUtilities.random(1, 15);
下面的例子模拟了一个骰子
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 19 页 共 23 页
package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.MouseEvent;
import ascb.util.NumberUtilities;
public class NumbersAndMath extends Sprite {
var _die:Sprite;
var _value:uint;
public function NumbersAndMath( ) {
_die = new Sprite( );
addChild(_die);
_die.addEventListener(MouseEvent.CLICK, rollDie);
rollDie(null);
}
private function rollDie(event:MouseEvent):void {
_value = NumberUtilities.random(1, 6);
_die.graphics.clear( );
_die.graphics.lineStyle( );
_die.graphics.beginFill(0xFFFFFF);
_die.graphics.drawRect(0, 0, 50, 50);
_die.graphics.endFill( );
_die.graphics.beginFill(0x000000);
if(_value == 1 || _value == 3 || _value == 5) {
_die.graphics.drawCircle(25, 25, 4);
}
if(_value == 2 || _value == 3 || _value == 4 ||
_value == 5 || _value == 6)
{
_die.graphics.drawCircle(11, 11, 4);
_die.graphics.drawCircle(39, 39, 4);
}
if(_value == 4 || _value == 5 || _value == 6) {
_die.graphics.drawCircle(11, 39, 4);
_die.graphics.drawCircle(39, 11, 4);
}
if(_value == 6) {
_die.graphics.drawCircle(11, 25, 4);
_die.graphics.drawCircle(39, 25, 4);
}
}
}
}
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 20 页 共 23 页
4.10. 产生唯一的随机数
问题
我要产生唯一数
解决办法
使用 NumberUtilities.getUnique( ) 方法
讨论
唯一随机数经常在产生唯一的URL 时用到。就是在URL后加上个唯一的数字,以区别于使用过的
URL,因此浏览器总是会去调用远程服务器而不是访问缓存
NumberUtilities.getUnique( ) 返回基于毫秒的数字
trace(NumberUtilities.getUnique( ));
下面的代码产生一组唯一的随机数:
for(var i:Number = 0; i < 100; i++) {
trace(NumberUtilities.getUnique( ));
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 21 页 共 23 页
4.11. 转换角度计算
问题
我要计算角度及转换为合适的单位
解决办法
使用 Unit 和 Converter 类
讨论
影片剪辑的_rotation 属性使用角度计算的。如果用弧度而不是角度就有些麻烦了。首先要把弧度值
转换为角度值,再赋值给 _rotation 属性,而且,大多数人喜欢用角度计算。还好,把弧度转换为
角度挺容易,只要180/Math.PI.,角度转换为弧度就反一下,Math.PI/180. ,而且使用自定义的Unit
和Converter 类更简单。
这两个类都是自定义类,在ascb.unit 包中,首先创建Unit 实例,然后描述需要转换的单位类型,
Unit.DEGREE, Unit.RADIAN, 和 Unit.GRADIAN 常量返回新的Unit 对象表示各种单位。Unit 对
象有些属性,包括name, category, label, 和labelPlural:
var degree:Unit = Unit.DEGREE;
trace(degree.name); // 显示: degree
trace(degree.category); // 显示: angle
trace(degree.label); // 显示: degree
trace(degree.labelPlural); // 显示: degrees
使用getConverterTo( ) 方法,传递 Unit 对象作为,得到converter 对象,看下面的代码得到弧度
向角度转换的对象:
var converter:Converter = Unit.DEGREE.getConverterTo(Unit.RADIAN);
一旦得到Converter 实例,运行convert( ) 方法,指定值进行转换:
trace(converter.convert(90));
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 22 页 共 23 页
convertWithLabel( ) 方法输出字符串:
var converterToRadians:Converter = Unit.DEGREE.getConverterTo(Unit.RADIAN);
var converterToDegrees:Converter = Unit.RADIAN.getConverterTo(Unit.DEGREE);
trace(converterToRadians.convertWithLabel(1));
trace(converterToRadians.convertWithLabel(57.2957795130823));
trace(converterToDegrees.convertWithLabel(1));
trace(converterToDegrees.convertWithLabel(0.0174532925199433));
/*
显示:
0.0174532925199433 radians
1 radian
57.2957795130823 degrees
1 degree
*/
如果执行相反操作,使用getConverterFrom( ) 方法:
var converter:Converter = Unit.DEGREE.getConverterFrom(Unit.GRADIAN);
trace(converter.convert(100));
trace(converter.convert(23));
ActionScript 3 Cookbook 中文版
第四章.数字和数学
第 23 页 共 23 页
4.12. 计算两点之间的距离
问题
我要计算两点之间的距离
解决办法
根据勾股定理,使用 Math.pow( ) 和 Math.sqrt( ) 联合计算
讨论
通过勾股定理可以计算出两点之间的距离(直线)。一个三角形,最长边的平方等于其他两边的平方
和:
a2 + b2 = c2
根据这个公式可以计算出两点之间的距离,a 是两点X坐标的差值,b 是两点Y坐标的差值:
var c:Number = Math.sqrt(Math.pow(a, 2) + Math.pow(b, 2));
