什么导致as3代码生成NaN作为结果?

时间:2012-12-30 22:38:06

标签: actionscript-3 nan

我有一些碰撞检测涉及任意角度的线,我无法提前知道。我已经设置了我的代码来将它们视为y = mx + b的形式,每当我创建一条水平线时,所有字段都以NaN形式出现。我的问题是:AS3中的哪些操作可能导致返回NaN。想到的是,一条完美的垂直线将具有Number.POSITIVE_INFINITY的斜率,我想这可能会导致潜在的错误。它不应该在水平线上,而是发生逻辑问题。关键是,是什么导致在AS3中返回NaN?

package {

    import flash.display.Sprite

    public class Line extends Sprite{

        var x1:Number, x2:Number, y1:Number, y2:Number;
        var m:Number, b:Number; //y = mx + b

    public function Line(x1C:Number, y1C:Number, x2C:Number, y2C:Number){
            x1 = x1C;
            x2 = x2C;
            y1 = y1C;
            y2 = y2C;
            if(x2 - x1 == 0)
                m = Number.POSITIVE_INFINITY;
            else if(y2 - y1 == 0)
                m = 0;
            else
                m = (y2 - y1) / (x2 - x1); //these calculations could be off....
            b = y1 - (m * x1);
            this.graphics.moveTo(x1, y1);
        }

    }

}

3 个答案:

答案 0 :(得分:0)

如果您声明一个数字并且没有指定一个值,那么它将是NaN。

例如:

var speed:Number;
trace(speed); // NaN

不像和int,默认为0;

var speed:int;
trace(speed); // 0

答案 1 :(得分:0)

全局isNan()函数的文档提供了一些示例:

  • 0除以0:0/0
  • 负数的平方根:Math.sqrt(-1)
  • 数字大于1或小于0的Arcsine:Math.asin(2)
  • 无法转换为数字"5a"的字符串:[解析时]

同时1 * someObject1 + someUndefinedNumber将评估为NaN

答案 2 :(得分:0)

  • 您的代码可能会在此生成NaN

    b = y1 - (m * x1);
    

如果m是无穷大,x10,那么乘以它应该会产生NaN,这不仅适用于AS3。

  • 我建议你永远不要使用斜率截距形式的线方程,你正在使用(y = Ax + B),因为你不能用这种方式定义垂直线。始终使用一般表格:Ax + By + C = 0

  • 不要将浮点数与==进行比较,始终将浮点数与epsilon进行比较。 might help。如果x2几乎等于x1,则代码可能会出现问题。