gpt4 book ai didi

java - Floor(X) 模 X 等于 X?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:21:49 25 4
gpt4 key购买 nike

快速提问。我基本上正在开发一个程序,其中我们有一个跨网格的实体。每次它完成一个“步骤”(即从 (0, 0) 到 (1, 0))时,我都需要触发一个事件。实体每帧的移动计算如下:

frameMovement = entitySpeed * (frameDeltaMs / 1000)

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

所以基本上,我正在尝试找出如何告诉系统该单元已完成一个“步骤”。显然,由于帧移动的计算方式,你永远不会准确地在一个新的正方形上,所以我必须将单位“剪辑”到那个正方形或者有一个方法如果我们在一定距离内就会返回“真”距正方形(现在我决定为 0.05wu - 距正方形约 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:我需要弄清楚实体何时从一个坐标移动到下一个坐标。坐标(以及实体在它们之间的过渡)存储为 float 。例如,如果一个实体正穿过一个正方形的一半,则该实体的 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)));

输出http://pastebin.com/egDwj7Gs

编辑 2:图片很有趣!

http://prntscr.com/1j193n

白色方 block 是实体。红色方 block 只是绘制的网格。每个正方形都是 16 x 16。

如您所见,现在白色方 block 位于 (6.5, 0)。我需要程序基本上识别它何时通过 (7, 0)。

编辑:Lee 和我聊了聊,这是我们的聊天记录: https://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;

最佳答案

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

所以...

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.

因此,除非 float 舍入误差的影响,否则 Floor(x) % x 为 0(对于整数)或 Floor(x)(对于非整数)。

更多

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

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

关于java - Floor(X) 模 X 等于 X?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18025787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com