2012-02-07 166 views
0

家伙,我有一个很奇怪的问题。我试图实现一个嵌套的for循环其将一个矩形成更小的块,然后进行检查以查看这些更小的块的具有点从i已经在他们定义的阵列(大矩形是320 * 240顺便说一句):嵌套for循环遍历不正确

 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) 
     { 

     } 
    } 

编辑:

想通了,很奇怪,apparantly它与我试图找到方法来做到块索引。为了解决这个问题,我初始化blockIndex为0以外的for循环,把blockIndex ++第三次for循环后,感谢您的帮助反正=)

 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++; 
      } 
     } 

回答

2

而不是使用XMIN ++和ymin ++我想你可能是指使用XMIN +1和ymin + 1。 ++会改变变量的值。

+0

,不幸的是没有工作,请参阅我的问题的更新。 – 2012-02-07 06:36:33

0

关于第一个内循环迭代,下面获取运行:

xmin++ 

为最内层循环的if语句的一部分。这得到执行320次,因此你的价值。其中第二次迭代,

edgetrunc[i, 0] >= xmin 

将是错误的,所以xmin++线将不被执行。一般来说,你应该避免在if语句中使用像xmin++这样的突变语句。重构,看看它是否修复你的问题

+0

我试过,但问题仍然存在=(我这样完全失去了。我甚至注释掉第三个环,如图我编辑的问题,它仍然螺丝了。 – 2012-02-07 06:16:50

0

它跳起来的原因是因为你的内部循环中的if语句中有xmin++

这可能很容易将xmin的值快速提高,具体取决于edgeIndex的值。

x++增量x然后使用其旧值。我认为你需要的仅仅是x+1,它使用值加1,而不改变值。

同上,用于在那里ymin++为好。

换句话说,它可能应该是:

if (edgetrunc[i, 0] >= xmin && edgetrunc[i, 0] < xmin + 1 && 
    edgetrunc[i, 1] >= ymin && edgetrunc[i, 1] < ymin + 1)