0

事前にわからない任意の角度の線を含む衝突検出があります。それらをy=mx + bの形式として扱うようにコードを設定しました。水平線を作成するたびに、すべてのフィールドがNaNとして出力されます。私の質問は、AS3でどのような操作を行うとNaNが返される可能性があるかということです。頭に浮かぶのは、完全に垂直な線の傾きがNumber.POSITIVE_INFINITYになるということです。これにより、潜在的なエラーが発生する可能性があると思います。水平線上にあるべきではありませんが、論理的な問題が発生します。重要なのは、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);
        }

    }

}
4

3 に答える 3

0

数値を宣言し、値を割り当てない場合、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)
  • 数値に変換できない文字列"5a":[解析時]

また1 * someObject、または1 + someUndefinedNumber評価しますNaN

于 2012-12-30T22:50:32.353 に答える
0
  • NaNあなたのコードはここで権利を生み出すかもしれません:

    b = y1 - (m * x1);
    

mが無限大であり、でx1ある場合0、それを乗算するとNaNになります。これは、AS3だけでなく当てはまります。

  • ()を使用しているスロープインターセプト形式の直線方程式は絶対に使用しないことをお勧めしますy = Ax + B。これは、この方法で垂直線を定義できないためです。常に一般的な形式を使用してください:Ax + By + C = 0

  • 浮動小数点数を==と比較しないでください。常に、浮動小数点数をイプシロンと比較してください。役立つかもしれませんx2がにほぼ等しい場合、コードに問題が発生する可能性がありますx1

于 2012-12-30T23:05:37.260 に答える