我正在尝试为作业创建一个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();
}
答案 0 :(得分:2)
对于每个块(x
,y
,z
),您将遍历最内层循环中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;