Menger Sponge算法在c ++中的应用

时间:2014-02-03 01:33:59

标签: c++ opengl fractals

我正在尝试为作业创建一个Menger Sponge,

Meger sponge image from Wikipedia

此时我有一个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();

}

1 个答案:

答案 0 :(得分:2)

对于每个块(xyz),您将遍历最内层循环中skipHere的所有元素。最多其中一次迭代可能会导致blockNumber == skipHere[i]并将skip设置为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;