我想计算存储为位打包整数数组的位图(黑白)的质心。我知道有一些快速算法可以计算整数中设置的位数,但这并不能帮助我计算质心。有任何想法吗?
例如,如果我的位图如下所示:
111000
111000
111000
000000
000000
000000
质心位于 1, 1。打包成 32 位整数(您选择 Endian),它可能看起来像这样:{width: 6, height: 6} { 3817734144, 0 }。
如果您还可以在不迭代每一位的情况下获得质量(示例中为 9),则加分。
最佳答案
假设您要一次处理一行。 (一旦你得到了每行的总质量和质心,它就是一个加权平均值来获得质心的 x 和 y 坐标)。
所以换句话说,你有一行位 bi 并且你想计算一些函数 f 的 bif(i) 的总和。如果 f(i)=1,那就是位数(我们称之为 C),如果 f(i)=i,它将给出质量 M 的总力矩(你将除以 C 得到质心)。
对于少于 8 位的输入,您可以轻松存储 C 和 M 表,每个表宽 256 字节。让我们将大于 8 位的数字写为 h:l,其中 l 是数字的低 8 位,h 是其余的位。
然后
C(h:l) = C(h:0) + C(0:l) = C(h) + C(l)
M(h:l) = M(h:0) + M(0:l) = M(h) + 8C(h) + M(l)
唯一棘手的位是 8C(h),对应于当我们计算 M(h) 而不是 M(h:0) 时,那些 C(h) 位被下移 8 位。
非递归地,如果您输入的字节为 x0、x1、x2、x3...
C(x) = C(x0) + C(x1) + C(x2) + C(x3) + ...
M(x) = M(x0) + M(x1) + M(x2) + M(x3) + ...
+8C(x1) + 16C(x2) + 24C(x3) + ...
然后您可以通过 M 和 C 对所有行进行平均。
关于algorithm - 挑战 : Bitmap Centroid,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5329080/