Actionscript 3 是什么导致as3代码生成NaN?

Actionscript 3 是什么导致as3代码生成NaN?,actionscript-3,nan,Actionscript 3,Nan,我有一些碰撞检测,涉及任意角度的线,我不能提前知道。我已经设置了我的代码,将它们视为形式y=mx+b,每当我创建一条水平线时,所有字段都显示为NaN。我的问题是:AS3中的哪些操作会导致NaN返回。我想到的是,一条完全垂直的线会有一个数的斜率,正无穷大,我想这可能会导致潜在的错误。它不应该在一条水平线上,但逻辑问题会发生。问题是,是什么导致NaN在AS3中返回 package { import flash.display.Sprite public class Line ex

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

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);
        }

    }

}

如果你声明了一个数字,但没有赋值,它将是NaN

例如:

var speed:Number;
trace(speed); // NaN
与默认为0的和int不同

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

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

  • 0除以0:
    0/0
  • 负数的平方根:
    Math.sqrt(-1)
  • 大于1或小于0的反正弦数:
    Math.asin(2)
  • 无法转换为数字的字符串
    “5a”
    :[解析时]
另外,
1*someObject
1+someUndefinedNumber
将计算为
NaN
  • 您的代码可能会在此处生成一个
    NaN

    b = y1 - (m * x1);
    
如果
m
是一个无穷大,而
x1
0
,那么乘以它应该得到NaN,这不仅适用于AS3

  • 我建议您永远不要在坡度截距形式中使用直线方程,您正在使用(
    y=Ax+B
    ),因为您无法以这种方式定义垂直线。始终使用常规形式:
    Ax+By+C=0

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


Q:“每当我创建一条水平线时,所有字段都显示为NaN”。嗯-听起来像是被零除,不是吗?问:你能给我们看一些代码吗????另外:看看这个链接:无论何时声明一个数字变量,默认值都是NaN,但这里的情况可能不是这样,包{import flash.display.Sprite公共类行扩展了Sprite{var x1:Number,x2:Number,y1:Number,y2:Number;var m:Number,b:Number;//y=mx+b公共函数行(x1C:Number,y1C:Number,x2C:Number,y2C:Number){x1=x1C;x2=x2C;y1=y1C;y2=y2C;if(x2-x1==0)m=Number.POSITIVE_无穷大;else if(y2-y1==0)m=0;else m=(y2-y1)/(x2-x1);//这些计算可能会被关闭……b=y1-(m*x1);this.graphics.moveTo(x1,y1);}})有行类的代码,格式怪异…嗯…你应该编辑问题并把代码放在那里这只是AS3文档中最常见的无效操作的列表。还有更多,如
0*infinity
infinity-infinity
当符号一致时,
余数(任何,0.0)
和其他一些。我对涉及到您的最后一点的场景一直有疑问,我可以请您详细说明该断言的理由吗?(当x2几乎等于x1时)你提到用==比较浮点数,我的线坐标是用mouseX和mouseY获得的,用int代替是一个选项吗?作为参考,我用鼠标画线。如果AS3保证鼠标坐标是整数,用
int
将是一个选项。我不太明白你到底想让我做什么重要的一点是,即使在一些“明显”的情况下,将浮点与==进行比较也是不好的。例如,
sin(1.2)
并不总是等于(=)sin(1.2),虽然它们的值可能相差1e-16…但找不到证明。=\n谢谢,这很有帮助。再次感谢所有帮助我找到这个问题的人。我刚才说的正是这些。