Не можете построить Quadtree?

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

У меня есть следующая функция, которая просто вызывает вспомогательную функцию, обрабатывающую длительный рекурсивный процесс построения дерева.

void Quadtree::constructQuadtree(Image* mImage){

if (mImage->imgPixels == 0) {
return;
}

root = new QTNode();this->root = buildQTRecur(mImage, 0, 0, mImage->rows);

}

Вот вспомогательная функция, которая обрабатывает большую часть построения дерева:

QTNode* Quadtree::buildQTRecur(Image* mImage, int startRow, int startCol, int subImageDim) {

if (this->root == NULL) {
return this->root;
}if (subImageDim >= 1) {

int initialValue = 0;

bool uniform = false;

// Check to see if subsquare is uniformly black or white (or grey)

for (int i = startRow; i < startRow + subImageDim; i++)
{
for (int j = startCol; j < startCol + subImageDim; j++)
{
if ((i == startRow) && (j == startCol))

initialValue = mImage->imgPixels[i*mImage->rows+j];

else {

if (mImage->imgPixels[i*(mImage->rows)+j] != initialValue) {
uniform = true;

break;

}
}
}
}

// Is uniform

if (uniform) {

this->root->value = initialValue;

this->root->NW = NULL;
this->root->SE = NULL;
this->root->SW = NULL;
this->root->NE = NULL;

return this->root;

}

else { // Division required - not uniform

this->root->value = 2; //Grey node

this->root->NW = new QTNode();
this->root->NE = new QTNode();
this->root->SE = new QTNode();
this->root->SW = new QTNode();

// Recursively split up subsquare into four smaller subsquares with dimensions half that of the original.

this->root->NW = buildQTRecur(mImage, startRow, startCol, subImageDim/2);
this->root->NE = buildQTRecur(mImage, startRow, startCol+subImageDim/2, subImageDim/2);
this->root->SW = buildQTRecur(mImage, startRow+subImageDim/2, startCol, subImageDim/2);
this->root->SE = buildQTRecur(mImage, startRow+subImageDim/2, startCol+subImageDim/2, subImageDim/2);

}

}

return this->root;

}

Я зацикливаюсь на бесконечном цикле, когда пытаюсь его запустить. Пожалуйста, дайте мне знать, было бы полезно увидеть что-нибудь еще, например, конструктор моего узла, или любую дополнительную информацию, чтобы помочь!

Спасибо.

0

Решение

Я вижу несколько проблем в вашем коде:

  • Кто отвечает за создание подузла? Если вы пишете оба

    this->root->NW = new QTNode();
    this->root->NW = buildQTRecur(mImage, startRow, startCol, subImageDim/2);
    

    затем вы выделяете новое дерево квадрантов, а затем перезаписываете его.

  • Вы получаете логику для вычисления равномерного обращения.

  • Если вы найдете два разных пикселя, то вы делаете break, Но это только выйти из внутреннего цикла. Вы должны рассмотреть возможность помещения этого в вспомогательную функцию и сделать return здесь, чтобы выйти из обоих кругов сразу.
  • по соображениям эффективности не стоит писать

    if ((i == startRow) && (j == startCol))
    initialValue = mImage->imgPixels[i*mImage->rows+j];
    

    Просто положи

    initialValue = mImage->imgPixels[startRow*mImage->rows+startCol];
    

    до цикла

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]