Вложено для цикла, не повторяющегося должным образом - PullRequest
0 голосов
/ 07 февраля 2012

Ребята, у меня действительно странная проблема.Я пытаюсь реализовать вложенный цикл for, который разбивает прямоугольник на более мелкие блоки, а затем проверяет, какие из этих меньших блоков имеют точки из массива, который я определил в них (большой прямоугольник равен 320 * 240, кстати):

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

        }
    }

РЕДАКТИРОВАТЬ:

понял это, это было странно, очевидноэто было связано с тем, как я пытался найти индекс блока.Чтобы это исправить, я инициализировал 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++;
            }
        }

Ответы [ 3 ]

2 голосов
/ 07 февраля 2012

Вместо использования xmin ++ и ymin ++ я думаю, что вы, вероятно, хотели использовать xmin + 1 и ymin + 1. ++ изменит значение в переменной.

0 голосов
/ 07 февраля 2012

Причина, по которой он так всплывает, заключается в том, что в вашем внутреннем цикле в выражении if есть xmin++.

Это может довольно легко быстро увеличить значение xmin, в зависимости отзначение edgeIndex.

x++ увеличивается x, затем используется его старое значение.Я думаю, что вам нужно просто x+1, который использует значение плюс один, без изменения значения.

То же самое для ymin++ там.

Другими словами, этовероятно должно быть:

if (edgetrunc[i, 0] >= xmin && edgetrunc[i, 0] < xmin + 1 &&
    edgetrunc[i, 1] >= ymin && edgetrunc[i, 1] < ymin + 1)
0 голосов
/ 07 февраля 2012

На первой итерации внутреннего цикла запускается следующее:

xmin++

как часть оператора if в самом внутреннем цикле. Это выполняется 320 раз, отсюда и ваша ценность. Одна вторая итерация,

edgetrunc[i, 0] >= xmin

будет ложным, поэтому строка xmin++ не будет выполнена. В общем, вы должны избегать использования операторов мутации, таких как xmin++ внутри операторов if. Измените это и посмотрите, решит ли это вашу проблему

...