2013-08-02 61 views
6

快速問題。 我基本上在一個程序中,我們有一個實體跨網格交叉。每次它完成一個「步驟」(即從(0,0)到(1,0)),我需要發射一個事件。實體的每幀移動計算公式爲:Floor(X)模X等於X?

frameMovement = entitySpeed * (frameDeltaMs/1000) 

然後添加到實體的X座標上。我選擇使用世界單位(1個世界單位是16像素)而不是原始像素作爲座標系統,僅僅是爲了分離關注點。世界不需要知道一個正方形的距離是16像素 - 只有繪圖系統可以。

所以基本上,我試圖找出如何告訴系統該單元完成了「步驟」。顯然,由於框架運動的計算方式,你永遠不會在一個新的正方形上,所以我必須將單位「剪輯」到該方格中,或者有一個方法,如果我們在一定距離內,它將返回「真」從廣場(現在我已經決定0.05瓦 - 從廣場約0.8像素)。

我迄今爲止的功能是這樣的:

return Math.floor(x) % x == 0; 

我只使用X看到,因爲我只是想獲得它做什麼工作的。然而,我的問題是,這個函數似乎返回兩個結果之一:

x = 0f; 
System.out.println(Math.floor(x) % x); 
> NaN 

這是可以預料的,因爲0%0確實是NaN。我可以解決這個問題。不過,我目前所面對的問題是其他結果..

x = 1f; // Or any number with 1sd > 0 
System.out.println(Math.floor(x) % x); 
> 1f 

也就是說,其他的結果總是返回X的值,而不是正確的模(其中,如果math.floor(x)和x等於 - 即x等於1f),應該是0.

我不完全確定是什麼導致了這種情況。如果您對我有任何問題或對我如何以更好的方式解決這個問題有任何建議,我全都耳熟能詳。

TL; DR:我需要弄清楚實體從一個座標移動到另一個座標的時間。座標(以及實體在它們之間的轉換)以浮點形式存儲。例如,如果一個實體在穿過正方形的一半,則實體的X座標被存儲爲1.5。最後,地板(1.0)%1.0 1.0返回,並且不爲0。

編輯:

在我的代碼我有這個

System.out.println("x equals " + x + ". Math.floor(x)%x==Math.floor(x): "+(Math.floor(x)%x==Math.floor(x))); 

隨着輸出http://pastebin.com/egDwj7Gs

編輯2: 圖像很有趣!

http://prntscr.com/1j193n

白色方塊是實體。紅色的正方形只是一個繪製的網格。每個廣場是16乘16。

正如你所看到的,現在白色方塊在(6.5,0)。我需要程序基本識別何時通過(7,0)。

編輯:李和我聊天,這裏是我們的聊天: http://chat.stackoverflow.com/rooms/34727/discussion-between-neglected-and-lee-meador

他解決了這個問題對我,所以我接受了他的答案是正確的。

 float after = pos.x+changeInPosition; 

     if (Math.floor(after) != Math.floor(pos.x)) { 
      // We passed a boundary 
     } 
     pos.x = after; 
+0

Y%X可以永遠等於X。它可以等於0到x-1之間的任何值。 –

+0

我的代碼我有這個:\t \t System.out.println(Math.floor(x)%x == Math.floor(x)); 它的評估是正確的。我知道它應該**不會等於它,但是我遇到的問題是它**會**。 –

+0

對我來說評價爲false。 –

回答

4

Modulo意味着我們分開並取其餘部分(就像我在三年級)。

所以......

10 % 9 is 1. 

而且

10 % 10 is 0 

而且

10.5 % 10.5 is 0. 

(或許,如果你有X = ...計算10.5,你可以得到的四捨五入問題..然後x%x,您將得到一個剛剛低於10.5或僅高於0的數字。)

因此,對於所有的整數,

Floor(x) % x is 0. 

對於非整數,它的工作方式不同。

Floor(10.5) => 10 

10 % 10.5 is 10. 

所以禁止在浮點舍入誤差的效果,地板(X)%x是0(對於整數)或地板(x)的非整數。

也許你可以判斷它由前比較和位置後,通過網格線:

if (Math.Floor(xAfterMoving/gridSize) != Math.floor(xBeforeMoving/gridSize)) { 
    fireXGridCrossingEvent(); 
} 
+0

嗯,在我的學校裏我從來沒有教過模數,我只知道它返回了剩餘的一個分裂方程式,你建議我用什麼來代替,然後呢?我只需要驗證該實體是否在一個正方形上,我能想到的唯一方法就是使用像素作爲測量,但看起來像一個非常糟糕的想法 –

+0

我試過這個,呃,它每當實體移動時觸發,而不一定當它穿過邊界時觸發。 –

+0

此外,運動系統不知道每個網格廣場有多大。它只知道1個座標變化意味着你完全穿過了一個方格。 :P –

相關問題