Floor(X)modulo X等于X?

Dan*_*try 6 java

快速的问题.我基本上正在开发一个程序,我们有一个实体跨越网格.每次完成"步骤"(即从(0,0)到(1,0)),我都需要触发一个事件.每帧实体的移动计算方法如下:

frameMovement = entitySpeed * (frameDeltaMs / 1000)
Run Code Online (Sandbox Code Playgroud)

然后添加到实体的X坐标上.我选择使用世界单位(1个世界单位是16个像素)而不是原始像素用于坐标系统,仅仅是为了分离关注点.世界不需要知道一个正方形的距离是16像素 - 只有绘图系统才有.

所以基本上,我正试图弄清楚如何告诉系统该单元已完成"步骤".显然,由于帧运动的计算方式,你永远不会完全在一个新的正方形上,所以我必须将单位"剪辑"到那个正方形,或者如果我们在一定的距离内,有一个方法会返回"true"从广场(现在我决定是0.05wu - 距离广场大约0.8像素).

到目前为止我的功能是这样的:

return Math.floor(x) % x == 0;
Run Code Online (Sandbox Code Playgroud)

我只是在使用X看,因为我只是想让它正常工作.但是我遇到的问题是这个函数似乎返回了两个结果之一:

x = 0f;
System.out.println(Math.floor(x) % x);
> NaN
Run Code Online (Sandbox Code Playgroud)

这是预期的,因为0%0确实是NaN.我可以解决这个问题.但是我目前的问题是另一个结果..

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

也就是说,另一个结果总是返回X的值,而不是正确的模数(如果math.floor(x)和x相等 - 即x等于1f),它应该是0.

我不完全确定导致这种情况的原因.如果您对我有任何答案或有关如何以更好的方式解决这个问题的任何建议,我会全力以赴.

TL; DR:我需要弄清楚实体何时从一个坐标移动到下一个坐标.坐标(以及实体跨越它们的过渡)存储为浮点数.如果实体在遍历正方形的中途,则实体的X坐标存储为1.5.最后,Floor(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)));
Run Code Online (Sandbox Code Playgroud)

输出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;
Run Code Online (Sandbox Code Playgroud)

Lee*_*dor 4

取模意味着我们除以余数(就像我三年级时一样)。

所以 ...

10 % 9 is 1.
Run Code Online (Sandbox Code Playgroud)

和

10 % 10 is 0
Run Code Online (Sandbox Code Playgroud)

和

10.5 % 10.5 is 0. 
Run Code Online (Sandbox Code Playgroud)

(如果你有 x = ...计算 10.5.. 然后 x % x 你会得到一个略低于 10.5 或略大于 0 的数字,那么你可能会遇到舍入问题。)

所以,对于所有整数,

Floor(x) % x is 0.
Run Code Online (Sandbox Code Playgroud)

对于非整数,它的工作方式有所不同。

Floor(10.5) => 10 
Run Code Online (Sandbox Code Playgroud)

和

10 % 10.5 is 10.
Run Code Online (Sandbox Code Playgroud)

因此,除非浮点中舍入误差的影响,Floor(x) % x 要么是 0(对于整数),要么是 Floor(x) 对于非整数。

更多的

也许你可以通过比较之前和之后的位置来判断它是否通过了网格线:

if (Math.Floor(xAfterMoving / gridSize) != Math.floor(xBeforeMoving / gridSize)) {
    fireXGridCrossingEvent();
}
Run Code Online (Sandbox Code Playgroud)