【问题标题】:Challenge: Bitmap Centroid挑战:位图质心
【发布时间】:2011-07-16 18:58:36
【问题描述】:

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

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

111000
111000
111000
000000
000000
000000

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

如果您还可以在不迭代每个位的情况下获得质量(示例中为 9),则可获得奖励积分。

【问题讨论】:

  • 我认为这对算法无关紧要,但为了记录:你想要浮点精度,还是整数坐标就足够了?如果是这样,它们应该如何四舍五入?
  • 你们对连通性提供哪些保证?
  • 通过上述设置位计数算法之一,质量应该是微不足道的。可能最简单的方法是单独通过。至于质心,我的直觉是,就任何有效的算法而言,您的数据表示确实对您不利,因为您将其打包成整数是以节省空间为代价来提高时间复杂度的任何关心位的几何布局。
  • @AakashM 没有,很遗憾。
  • @Martin 我也有这种感觉,但我必须同时针对此位图渲染几何图形并快速查询单点。实际的渲染过程不是瓶颈,所以如果你能提出更好的表示,我会感兴趣。

标签: algorithm bitmap collision-detection centroid


【解决方案1】:

假设您要一次处理一行。 (一旦你得到了每行的总质量和质心,它就是一个加权平均值来获得质心的 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 位。

非递归,如果您的输入为 bytes 是 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 对所有行进行平均。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    相关资源
    最近更新 更多