2013-08-02 17 views
6

簡単な質問です。 私は基本的にグリッドを横切るEntityクロスを持つプログラムに取り組んでいます。 「ステップ」(つまり、(0、0)から(1、0)になる)を終了するたびに、私はイベントを起動する必要があります。フレーム当たりのエンティティの動きは、次の式で計算されます。エンティティのX座標にエンティティの動きが加算されます。私は、単純に関心の分離のために座標系の生のピクセルの代わりに世界単位(1ワールド単位は16ピクセルです)を使用することを選択しました。世界は、1つの四角形の距離が16ピクセルであることを知る必要はなく、描画システムだけが行います。Xを法とする階(X)はXに等しいか?

基本的に、私はユニットが「ステップ」を終えたことをシステムに伝える方法を工夫しています。明らかに、フレームの動きが計算される方法のために、正確に新しい正方形になることはありませんので、ユニットをその四角形に「クリップ」するか、または一定の距離内にある場合は「真」を返すメソッドを持たなければなりません正方形から(私は今0.05Wuと決めています - 正方形から約0.8ピクセル)。私は、私はちょうどそれが現時点で働いて取得しようとしているとして見てXを使用してい

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

私がこれまで持っている機能はこれです。しかし、私が持っている問題は、この関数は2つの結果のいずれかを返すように見えるということです:0%0が実際にNaNであるように、これは、予想される

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

。私はこの問題を回避することができます。しかし、私は現時点で持っている問題は、他の結果..です

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

つまり、他の結果は常に、むしろ(、もしmath.floor(x)が正しいモジュロよりも、Xの値を返し、 xは等しい - すなわち、xは1fに等しい)。これは0である必要があります。

私はこれを引き起こしているかどうかは完全にはわかりません。あなたが私のために何か答えがあるか、これをより良い方法で修正する方法についての提案があれば、私はすべて耳にします。

TL; DR:エンティティがある座標から次の座標に移動するときを把握する必要があります。座標(およびそれらを横切るエンティティの遷移)は浮動小数点として格納されます。エンティティが四角形を横断する途中である場合、エンティティのX座標は、例えば1.5として記憶される。最後に、フロアは(1.0)%1.0は1.0を返して、そしてない0

EDIT:

私のコードで

私は、この出力で

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

http://pastebin.com/egDwj7Gs

EDIT 2: 画像は楽しいです!

http://prntscr.com/1j193n

白い四角が実体です。赤い四角形は単に描画されたグリッドです。各正方形は16×16です。

ご覧のとおり、白い四角は(6.5、0)です。私は基本的にプログラムが通過する時を認識する必要があります(7、0)。

EDIT:リーと私はチャットを持っていた、ここで私たちのチャットだ: 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

モジュロとは、残りの部分を分けて取ることを意味します(私にとっては3級と同じです)。

そう...

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は非整数の(x)が0(整数)または床のいずれかです。

もっと

それは前と位置の後に比較することにより、グリッドラインを通過した場合はおそらく、あなたが言うことができる:

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

私の学校では、私はモジュラスを教えられませんでした。私が考えることのできる唯一の選択肢は、ピクセルを測定値として使用することですが、そのように思えます。 –

+0

私はこれを試してみました。エンティティが移動するたびにトリガされますが、必ずしも境界を越えるとは限りません。 –

+0

また、Movementシステムには、各グリッドの正方形の大きさについての知識もありません。 1つの座標の変化は、あなたが完全に正方形を横切ったことを意味します。 :P –

関連する問題