- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
快速提问。我基本上正在开发一个程序,其中我们有一个跨网格的实体。每次它完成一个“步骤”(即从 (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:图片很有趣!
白色方 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/
我有 floor(sqrt(floor(x))) .这是真的: 内部floor是多余的。 外floor是多余的。 最佳答案 显然,外层不是多余的,因为例如,sqrt(2)不是整数,因此 floor(s
如何将 floor 函数应用于 float 或 double 值以获得整数。我得到了 double 值:4.4497083717E10float Value:4.4497084E10 在我的函数中。我
这个问题在这里已经有了答案: Using bitwise OR 0 to floor a number (7 个答案) 关闭 6 年前。 我刚刚在一些 JavaScript 中看到了这个快捷方式。
PHP 中的 floor 函数行为异常。对于 16 个十进制值,它给出了下限值,但通过增加 1 个小数点来舍入。 $int = 0.99999999999999999; echo floor($int
这是我的 HTML: floor 1: {{Math.floor( value ) }} floor 2: {{value }} floor 3: {{value |
(floor) 在 C 中实际上是如何工作的?据 Techonthenet 报道。 com, In the C Programming Language, the floor function ret
我正在将我的 MATLAB 代码转换为 Excel 文档,但在转换以下公式时遇到困难。 x=(b/N)*(-floor(N/2):floor(N/2)) 如果例如 b =2 且 N = 5结果将是
与 math.floor 相比,使用整数除法运算符在性能上有什么好处吗? 7 // 2 结束 math.floor(7/2) 最佳答案 整数除法比 math.floor 函数调用快得多: >>> im
我有一个关于 Haskell 的问题 floor函数 - 它应该返回“不大于参数的最大整数”,但表达式 floor 3.9999999999999999 返回 4 而不是 3。它可能与 Double
我想用可变的十进制长度(在 iphone sdk 中)将小数点后的 double 取整。 这里有一些例子可以告诉你我的意思 NSLog(@"%f",[self floorMyNumber:34.524
我知道 float 通常会包含舍入误差。 当您取 float (或 double )的底限或上限以将其转换为整数时,结果值是否准确,或者“底限”值是否仍然是近似值? 基本上,像 floor(3.141
我正在尝试用 C++ 实现一个系统,我可以在其中判断数字是否为整数(小数点后的所有内容均为零)。为此,我使用了 if (sqrt(answer/2) == floor(sqrt(answer/2)))
我正在编写一段代码,我需要处理不一定在 0 到 1 范围内的 uvs(2D 纹理坐标)。例如,有时我会得到一个 u 分量为 1.2 的 uv。为了处理这个问题,我正在实现一个包装,它通过执行以下操作导
CREATE TABLE table_name (col_a double(10,2), col_b double(10,2), col_c double(10,2)); INSERT INTO ta
这个问题在这里已经有了答案: Why does Math.round(0.49999999999999994) return 1? (5 个答案) 关闭 8 年前。 我开发了一个 c++ 应用程序(
我需要一个函数来将正 double 四舍五入到最接近的整数。潜伏 aorund 我发现这种非常优雅的方式 int x = floor(y + 0.5); 我写了一个简单的测试程序: double a
在 C89 中,floor() 返回一个 double 值。以下是否保证有效? double d = floor(3.0 + 0.5); int x = (int) d; assert(x == 3)
floor() 函数向下舍入为最接近的整数。 语法 floor(x) 参数 描述 x 必需。一个数。 说
有谁知道方法/功能如何Int()或 floor()实现的? 我正在寻找以下相应的实现 abs()功能。 Int Abs (float x){ if x > 0 return x;
我的问题如下:log(1000,10) 返回 3,但 floor(log(1000,10)) 返回 2。如何解决这个问题? 我的 php 版本是 5.6.30-0+deb8u1。 最佳答案 因为 lo
我是一名优秀的程序员,十分优秀!