考虑两个坐标系,一个用于对象本身,一个用于包含对象的块。让我们考虑块大小为4,这意味着坐标0处的对象位于块0中,坐标3处的对象是同样在块0中,但是坐标8处的对象在块2中,坐标-4处的对象在块-1中。
计算具有正位置的对象的块数很容易:object.number/chunk_size
但是我没有找到一个公式来计算负位置对象的正确块位置:
-4/4 = -1
是正确的,但-2/4 = 0
不是必需的结果,但-4/4 -1 = -2
现在不正确,但-2/4 -1 = -1
现在正确...
计算每个职位是否有一个甜蜜,简短的方法,或者我需要检查两个条件:
chunkx = objectx > 0 ?
objectx / chunksize :
objectx % chunksize == 0 ?
objectx / chunksize :
objectx / chunksize - 1;
替代:
chunkx = objectx > 0 || objectx % chunksize == 0 ?
objectx / chunksize :
objectx / chunksize -1;
注意:计算块中对象的位置是:
internalx = objectx - chunkx * chunksize
对于正面和负面(-4 - > 0; -2 - > 2; 1 - > 1; 4 - > 0)
有没有更优雅的方式来计算这个我公然监督这里?
答案 0 :(得分:1)
如果你能负担得起将数字转换为浮点并具有廉价的楼层功能,你可以使用floor(-1.0 / 4.0)来获得-1,但是转换到浮点可能比分支。
另一种选择是只使用一个足够大的数字(块大小的倍数)到对象坐标,并从块块坐标中减去该块除以块大小来处理正数。这可能比分支便宜。
对于你的第二个问题,如果你的块大小恰好是2的幂,你可以使用二进制和(-1&(chunksize-1)== 3)
答案 1 :(得分:0)
如果你的块大小是2的幂,你可以这样做:
chunkx = (objectx & ~(chunksize - 1)) / chunksize;
如果块大小也是常量,编译器可能会把它变成一个简单的AND和shift。如,
chunkx = (objectx & 3) >> 2;
对于一般情况,我认为你不能消除分支,但是你可以通过在分割之前抵消数字来消除慢模运算:
chunkx = ((objectx >= 0) ? (objectx) : (objectx - (chunksize - 1))) / chunksize;