2013-07-22 4 views
0

Я пытаюсь построить квадрант и с трудом. Он предназначен для чтения двоичного изображения (обрабатывается в другом месте) и выполняет различные операции. Однако, конечно, сначала нужно построить квадратное дерево. Я хочу продолжить разделение дерева до тех пор, пока все пиксели не будут иметь один сплошной цвет (черный или белый) для удобства манипуляции.Не удается построить 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

Это когда лучший способ получить ответ заключается в отладке , Установите точки останова, условные точки останова и исследуйте. –

ответ

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]; 
    

    перед циклом

Смежные вопросы