2012-12-30 46 views
0

我有一些碰撞檢測涉及任何角度的線,我不能提前知道。我已經建立了我的代碼,將它們視爲y = mx + b形式,並且每當創建水平線時,所有字段都以NaN形式出現。我的問題是:AS3中的哪些操作會導致返回NaN。想到的是,一條完美的垂直線將具有Number.POSITIVE_INFINITY的斜率,我想這可能會導致潛在的錯誤。它不應該在水平線上,但會發生邏輯問題。關鍵是,什麼導致NaN在AS3中返回?什麼原因導致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

問:「每當我創建一條水平線時,所有字段都以NaN出現」。嗯 - 這聽起來像是被零除了,不是嗎?問:你能告訴我們一些代碼嗎?另外:看看這個鏈接:http:// stackoverflow。COM /問題/ 12123047 /數學隱藏碰撞 – paulsm4

+0

每當聲明Number變量的缺省值將爲NaN,但它可能是不是這裏的情況 –

+0

包{ \t \t進口flash.display.Sprite \t \t \t公共類線延伸雪碧{ \t \t \t \t VAR X1:數字,X2:號碼,Y1:號碼,Y2:號碼; \t \t var m:Number,b:Number; // Y = mx + b中 \t \t \t 公共\t函數線(X1C:數字,Y1C:數字,X2C:數字,Y 2 O:編號){ \t \t \t X1 = X1C; \t \t \t x2 = x2C; \t \t \t y1 = y1C; \t \t \t y2 = y2C; \t \t \t如果(X2 - X1 == 0) \t \t \t \t M = Number.POSITIVE_INFINITY; \t \t \t否則如果(Y2 - Y1 == 0) \t \t 米= 0; \t \t \t別的 \t \t \t \t M =(Y2 - Y1)/(X2 - X1); //這些計算可能是關閉的...... \t \t \t b = y1 - (m * x1); \t \t \t this.graphics.moveTo(x1,y1); \t \t} \t \t \t} \t } – avorum

回答

0
  • 您的代碼可能產生NaN就在這裏:

    b = y1 - (m * x1); 
    

如果m是無窮大, x10,然後乘它應該導致NaN,這不僅適用於AS3。

  • 我會建議你從來沒有在一個斜截式使用直線方程,您使用的是(y = Ax + B),因爲你不能定義一個垂直線這種方式。始終使用一般形式:Ax + By + C = 0

  • 不要將浮點數與==比較,總是將浮點數與epsilon進行比較。 might help。如果x2幾乎等於x1,則代碼中可能有問題。

+0

我一直在遇到涉及到你最後一點的情況時遇到問題,我能否讓你詳細說明該斷言的推理? (當x2幾乎等於x1時) – avorum

+0

你提到使用==比較浮點數,我的座標是使用mouseX和mouseY獲取的,會使用int而不是一個選項嗎?爲了參考,我使用鼠標畫線。 – avorum

+0

如果AS3保證鼠標座標是整數,則使用'int'將是一個選項。我不太明白你想要我詳細說明的內容。主要的一點是,使用==比較浮點並不好,即使在一些「明顯」的情況下也是如此。例如,「sin(1.2)」與「sin(1.2)」並不總是相等(==),儘管它們的值可能相差1e-16 ....無法找到證明。 = \ – Ixanezis

0

如果您聲明一個數字並且不指定一個值,它將是NaN。

例如:

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

不像和INT缺省值爲0;

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

全球isNan()函數的文檔提供了一些例子:

  • 0除以0:0/0
  • 負數的平方根:Math.sqrt(-1)
  • 反正弦大於1或小於0:Math.asin(2)
  • 無法轉換爲數字的字符串"5a":[when解析它]

而且1 * someObject1 + someUndefinedNumber將評估爲NaN

+1

這只是一個最名單AS3文檔中常見的無效操作。當[IEEE 754浮點算術標準](http://www.cs.berkeley.edu/~wkahan/ieee754status/IEEE754.PDF)中有更多,例如'0 * infinity','infinity-infinity'時符號同意,「REMAINDER(Anything,0.0)」和其他一些。 – Ixanezis

相關問題