检查二维向量中的邻居周围坐标时返回的值不正确
Posted
技术标签:
【中文标题】检查二维向量中的邻居周围坐标时返回的值不正确【英文标题】:Incorrect values returned when checking neighbours surrounding coordinate in 2d vector 【发布时间】:2014-02-27 06:17:08 【问题描述】:我的代码结果有一个奇怪的问题。基本上我有一个精灵,我通过检查每个像素的 alpha 值并将结果存储在布尔值的二维向量中来创建这个精灵的“hitbox”,其中 alpha 0 = false 的像素和任何其他值 = true .我在这里展示的测试用例是一个没有透明像素的 10x10 像素正方形。将此二维数组中每个坐标的值表示为 1(真)或 0(假),结果如下:
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
1111111111
这个二维向量被称为“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 以 int 形式返回精灵的高度和宽度(以像素为单位)。据我所知,这应该会导致 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
我无法弄清楚为什么这段代码没有给出我想要的结果。我假设我在某处犯了错字或逻辑错误,但对于我的生活,我找不到它!任何帮助将不胜感激。
【问题讨论】:
如果将sprite.getLocalBounds()
部分替换为10
会发生什么?
【参考方案1】:
if (hitBox[i - 1][j - i] && /*...*/
第二个索引是错误的。它应该是j - 1
而不是j - i
。修复这个地方后的结果见http://ideone.com/kY2MMy。
【讨论】:
达姆。从 10 分钟开始检查此代码,我怎么会错过...但是hitBox[i - 1][j - i]
将始终返回 true,因为它会给出 0,所以这不是问题。
@Mayerz @Proply 无论如何,在我将其从 j-i
更改为 j-1
后它可以工作,如 ideone.com/kY2MMy 所示
好的,但是等等,hitBox[i - 1][j - i]
永远是真的,对吧?
@Mayerz hitBox[i-1][j-i]
i > j
时会导致越界访问。
Idd,我的错!卡在 10x10 示例中。以上是关于检查二维向量中的邻居周围坐标时返回的值不正确的主要内容,如果未能解决你的问题,请参考以下文章