0

我有一些涉及我无法提前知道的任意角度线的碰撞检测。我已经设置了我的代码以将它们视为 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);
        }

    }

}
4

3 回答 3

0

如果您声明一个 Number 并且不分配值,它将是 NaN。

例如 :

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

与默认为 0 的 int 不同;

var speed:int;
trace(speed); // 0
于 2012-12-30T22:46:17.433 回答
0

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

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

1 * someObject1 + someUndefinedNumber将评估为NaN

于 2012-12-30T22:50:32.353 回答
0
  • 您的代码可能会在NaN此处生成:

    b = y1 - (m * x1);
    

如果m是无穷大,并且x10,那么乘以它应该得到 NaN,这不仅适用于 AS3。

  • 我建议您永远不要使用斜截距形式的直线方程y = Ax + B,因为您无法以这种方式定义垂直线。始终使用一般形式:Ax + By + C = 0.

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

于 2012-12-30T23:05:37.260 回答