快速提问。我基本上是在做一个程序,在这个程序中有一个实体跨越网格。每次它完成一个“步骤”(即从(0,0)到(1,0))时,我需要触发一个事件。该实体的每个框架的移动是通过以下方法计算的:
frameMovement = entitySpeed * (frameDeltaMs / 1000)然后添加到实体的X坐标上。我选择使用世界单位(一个世界单位是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:我需要弄清楚一个实体何时从一个协调点移动到另一个协调点。协调器(以及实体在它们之间的转换)被存储为浮点。例如,如果一个实体在穿越正方形的过程中,它的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)。
编辑:李和我聊了一会,下面是我们的聊天: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;发布于 2013-08-02 20:50:45
Modulo的意思是我们除以余数(就像我在三年级时一样)。
所以..。
10 % 9 is 1.和
10 % 10 is 0和
10.5 % 10.5 is 0. (如果有x= ...calculate 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)。
More
也许您可以通过比较前后的位置来判断它是否通过了网格线:
if (Math.Floor(xAfterMoving / gridSize) != Math.floor(xBeforeMoving / gridSize)) {
fireXGridCrossingEvent();
}https://stackoverflow.com/questions/18025787
复制相似问题