快速問題。 我基本上在一個程序中,我們有一個實體跨網格交叉。每次它完成一個「步驟」(即從(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: 圖像很有趣!
白色方塊是實體。紅色的正方形只是一個繪製的網格。每個廣場是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;
Y%X可以永遠等於X。它可以等於0到x-1之間的任何值。 –
我的代碼我有這個:\t \t System.out.println(Math.floor(x)%x == Math.floor(x)); 它的評估是正確的。我知道它應該**不會等於它,但是我遇到的問題是它**會**。 –
對我來說評價爲false。 –