检查2d向量中坐标周围的邻居时返回的值不正确

时间:2014-02-27 06:17:09

标签: c++ multidimensional-array

我的代码结果有一个奇怪的问题。基本上我有一个精灵,我通过检查每个像素的alpha值并将结果存储在布尔值的2d向量中来创建此精灵的“hitbox”,其中alpha 0 = false的像素和任何其他值= true 。我在这里展示的测试用例是一个10x10像素的正方形,没有透明像素。将此2d数组中每个坐标的值表示为1(true)或0(false)会产生以下结果:

1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111

这个2d向量称为“hitBox”。我的代码用于检查hitBox中的每个坐标以查看它是否返回“true”(除了表示精灵最外面像素的坐标),如果返回true,则检查每个坐标的邻居以查看它们是否返回“真实”也。如果所有邻居都返回true,则“hitBox2”(以hitBox的副本开始)的相应坐标的值从“true”变为“false”。用于此目的的代码的直接副本如下:

vector<vector<bool> > hitBox2;
hitBox2 = hitBox;
for (int i = 1; i < sprite.getLocalBounds().height - 1; ++i) //i starts at 1 to avoid checking edge tiles, check is < height - 1 for same reason
{
    for (int j = 1; j < sprite.getLocalBounds().width - 1; ++j)
    {
        if(hitBox[i][j])
        {
            if (hitBox[i - 1][j - i] &&
                hitBox[i - 1][j] &&
                hitBox[i - 1][j + 1] &&
                hitBox[i][j - 1] &&
                hitBox[i][j + 1] &&
                hitBox[i + 1][j - 1] &&
                hitBox[i + 1][j] &&
                hitBox[i + 1][j + 1])
                    hitBox2[i][j] = false;
        }
    }
}

sprite.getLocalBounds()。height和.width以精灵为单位返回精灵的高度和宽度(以像素为单位)。据我所知,这应该导致hitBox2结束如下:

1111111111
1        1
1        1
1        1
1        1
1        1
1        1
1        1
1        1
1111111111

但是,相反,hitBox2出现如下:

1111111111
1        1
1        1
11       1
111      1
1111     1
1 111    1
1  111   1
11  111  1
1111111111

我无法弄清楚为什么这段代码没有给出我想要的结果。我假设我在某处犯了错误或逻辑错误,但对于我的生活我找不到它!任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

      if (hitBox[i - 1][j - i] && /*...*/

第二个指标错了。它应该是j - 1而不是j - i。修复此地点后,请参阅http://ideone.com/kY2MMy了解结果。