Алгоритм Менгера Губка в C ++

0

Я пытаюсь создать Menger Sponge для задания,

Изображение Meger sponge из Википедии

и в этот момент у меня есть кубик кубика 3 * 3 * 3. Теперь я пытаюсь удалить правильные блоки, чтобы сформировать первую итерацию фрактала. Каждый из 27 блоков я дал индекс, начиная с 0 (blockNumber в моем коде). Блок, который я должен удалить, содержится в моем массиве skipHere []. 4 - первый, который удален, потому что это средний блок первой строки.

Однако этот код все еще печатает полную структуру 3 * 3 * 3, а не пропускает какой-либо блок, который я пытаюсь пропустить. Поэтому я думаю, что я неправильно перебираю массив skipHere [], но у меня возникли проблемы с поиском логической ошибки.

void display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);

    UpdateTransform(0,0,0);

    int skipHere[7] = {4, 10, 12, 13, 14, 16, 22};
    int blockNumber = 0;
    bool skip = false;
    int x = 0;
    int y = 0;
    int z = 0;
    float Xres = 0;
    float Yres = 0;
    float Zres = 0;
    for(x = 0;x < 3; ++x)
    {

      for(y = 0; y < 3; ++y)
      {

      for(z = 0; z < 3; ++z)
      {
        for(int i = 0; i < 7; i++)
        {

          if(blockNumber == skipHere[i])
          {
            skip = true;
          }

          if(skip == false)
          {
            glPushMatrix();
            UpdateTransform(Xres,Yres,Zres);
            drawOneCube();
            glPopMatrix();

          }
          skip = false;


      }

      Zres -= 1.1;

      blockNumber += 1;
    }   

    Yres += 1.1;
    Zres = 0;

      }

      Xres += 1.1;
      Yres = 0;


    }


    glutSwapBuffers();

}
Теги:
opengl
fractals

1 ответ

2
Лучший ответ

Для каждого блока (x, y, z) вы перебираете все элементы skipHere в самом внутреннем цикле. В максимуме одна из этих итераций могла привести blockNumber == skipHere[i] и установить значение skip to true.

Однако вы также устанавливаете skip = false впоследствии в каждой итерации цикла. Так что практически вы будете печатать каждый блок не менее 6 раз (потому что он будет пропущен не более одного раза из семи итераций для i).

Вы должны переместить часть

if(skip == false)
{
  glPushMatrix();
  UpdateTransform(Xres,Yres,Zres);
  drawOneCube();
  glPopMatrix();

}
skip = false;

вне самой внутренней циклы, поэтому существует не более одной печати каждого блока, и только если ни одна из семи самых внутренних итераций цикла не привела к тому, что skip = true.

for(int i = 0; i < 7; i++)
{
    if(blockNumber == skipHere[i])
    {
        skip = true;
    }
}

if(!skip)
{
    glPushMatrix();
    UpdateTransform(Xres,Yres,Zres);
    drawOneCube();
    glPopMatrix();
}

skip = false;
  • 0
    Спасибо вам большое! Перемещение его за пределы самой внутренней петли решило это :) Теперь у меня есть первая стадия фрактала :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню