2

想象一个简单的二维整数网格。它被更大的整数网格分成块。给出了相等块的尺寸。

要从全局坐标中获取块,我可以简单地将坐标除以块大小并删除小数位:chunk.x = global.x / chunksize.x. 这仅适用于无符号数字,因为负坐标不会四舍五入到正确的方向。因此,我手动向下应用四舍五入:chunk.x = (int)floor((float)global.x / chunksize.x). 这工作得很好,但另一部分来了。

我还想从全局坐标计算相对于包含块的坐标。对于无符号数,我只使用了余数:local.x = global.x % chunksize.x;. 但这不适用于负坐标,因为负块的局部坐标没有镜像。

即使在负数空间中,如何在不计算块之前计算局部坐标?

4

2 回答 2

2

const int M = 100000;
//chunk.x = (global.x + M*chunksize.x) / chunksize.x - M;
local.x = (global.x + M*chunksize.x) % chunksize.x;

应该比浮点数转换快得多。

或者,

//chunk.x = global.x / chunksize.x;
local.x = global.x % chunksize.x;
if (local.x < 0) {
     //chunk.x--;
     local.x += chunksize.x;
}
于 2013-03-11T22:26:22.937 回答
1

对于负面结果,将块大小添加到它们(这使它们成为正面)。如果你再次取模,你会得到一个对正负同样适用的表达式global.x

local.x = ((global.x % chunksize.x) + chunksize.x) % chunksize.x;
于 2013-03-11T22:26:07.187 回答