挑战:位图质心

时间:2011-03-16 17:17:09

标签: algorithm bitmap collision-detection centroid

我想计算存储为位整数数组的位图(黑色和白色)的质心。我知道有一些快速算法用于计算整数中的设置位数,但这并不能帮助我计算质心。有什么想法吗?

例如,如果我的位图如下所示:

111000
111000
111000
000000
000000
000000

质心是1,1。打包成32位整数(你选择Endian),它可能看起来像这样:{width:6,height:6} {3817734144,0}。

如果您还可以获得质量(示例中为9)而不迭代每个位,则获得积分。

1 个答案:

答案 0 :(得分:2)

我们假设您要一次处理这一行。 (一旦得到总质量和每行的质心,它就是加权平均值,以获得质心的x和y坐标)。

所以换句话说,你有一行b i ,你想要为某些函数f计算b i f(i)的总和。如果f(i)= 1,那就是位数(让我们称之为C),如果f(i)= i,它将给出质量M的总时刻(你的' l除以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来平均所有线。