我有一些碰撞检测涉及任意角度的线,我无法提前知道。我已经设置了我的代码来将它们视为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);
}
}
}
答案 0 :(得分:0)
如果您声明一个数字并且没有指定一个值,那么它将是NaN。
例如:
var speed:Number;
trace(speed); // NaN
不像和int,默认为0;
var speed:int;
trace(speed); // 0
答案 1 :(得分:0)
全局isNan()函数的文档提供了一些示例:
0/0
Math.sqrt(-1)
Math.asin(2)
"5a"
的字符串:[解析时] 同时1 * someObject
或1 + someUndefinedNumber
将评估为NaN
答案 2 :(得分:0)
您的代码可能会在此生成NaN
:
b = y1 - (m * x1);
如果m
是无穷大,x1
是0
,那么乘以它应该会产生NaN,这不仅适用于AS3。
我建议你永远不要使用斜率截距形式的线方程,你正在使用(y = Ax + B
),因为你不能用这种方式定义垂直线。始终使用一般表格:Ax + By + C = 0
。
不要将浮点数与==进行比较,始终将浮点数与epsilon进行比较。 might help。如果x2
几乎等于x1
,则代码可能会出现问题。