嵌套的for循环未正确迭代
本文关键字:迭代 循环 for 嵌套 | 更新日期: 2023-09-27 18:22:43
伙计们,我有一个非常奇怪的问题。我正在尝试实现一个嵌套的for循环,它将矩形分割成更小的块,然后检查这些更小的块中的哪些块具有我在其中定义的数组中的点(大矩形是320*240 btw):
int[,] edgetrunc = new int[edgeIndex, 2]; //edgeIndex is the number of points in the external array
Array.Copy(edgePoint, edgetrunc, edgeIndex*2);//truncates the nulls from the tail of my array
int delx = 16;//width of block
int dely = 12;//height of block
int blockIndex = new int();
bool[] block = new bool[(depthFrame.Width/delx)*(depthFrame.Height/dely)];
for (int ymin = 0;ymin < depthFrame.Height;ymin += dely)
{
for (int xmin = 0; xmin < depthFrame.Width; xmin += delx)
{
blockIndex = (xmin / delx) + (ymin / dely);
for (int i = 0; i < edgeIndex; i++)
{
if (edgetrunc[i, 0] >= xmin && edgetrunc[i, 0] < xmin++ && edgetrunc[i, 1] >= ymin && edgetrunc[i, 1] < ymin++)
{
block[blockIndex] = true;
break;
}
}
}
}
不过,在这个问题上,我在第二个for循环(xmin循环)上设置了一个断点,并开始迭代,在第一次迭代中,xmin的值从0跳到了320,之后一直保持不变,每次迭代都只更改ymin。我疯了吗?我做错了什么?
PS我甚至测试了这个,我得到了同样的问题:
for (int ymin = 0;ymin < depthFrame.Height;ymin += dely)
{
for (int xmin = 0; xmin < depthFrame.Width; xmin += delx)
{
}
}
编辑:
弄清楚了,这很奇怪,很明显,这与我试图找到块索引的方式有关。为了解决这个问题,我在for循环之外将blockIndex初始化为0,并在第三个for循环之后放置blockIndex++,感谢大家的帮助=)
int blockIndex = 0;
bool[] block = new bool[(depthFrame.Width/delx)*(depthFrame.Height/dely)];
for (int ymin = 0;ymin < depthFrame.Height;ymin += dely)
{
for (int xmin = 0; xmin < depthFrame.Width; xmin += delx)
{
for (int i = 0; i < edgeIndex; i++)
{
if ((edgetrunc[i, 0] >= xmin) && (edgetrunc[i, 0] < (xmin + delx)) && (edgetrunc[i, 1] >= ymin) && (edgetrunc[i, 1] < (ymin + dely)))
{
block[blockIndex] = true;
break;
}
}
blockIndex++;
}
}
我认为您可能打算使用xmin+1和ymin+1,而不是使用xmin++和ymin++。++将更改变量中的值。
在第一次内部循环迭代中,运行以下内容:
xmin++
作为最内部循环中if语句的一部分。这会被执行320次,因此是您的价值所在。一次第二次迭代,
edgetrunc[i, 0] >= xmin
将为false,因此xmin++
行将不会被执行。通常,应避免在if语句中使用xmin++
等突变语句。重新考虑一下,看看它是否解决了你的问题
它之所以如此跳跃,是因为在内部循环的if
语句中有xmin++
。
这可以很容易地根据edgeIndex
的值来快速驱动xmin
的值。
CCD_ 7递增CCD_。我认为您需要的只是x+1
,它使用值加一,而不更改值。
ymin++
也是如此。
换句话说,它可能应该是:
if (edgetrunc[i, 0] >= xmin && edgetrunc[i, 0] < xmin + 1 &&
edgetrunc[i, 1] >= ymin && edgetrunc[i, 1] < ymin + 1)