Я пытаюсь создать 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();
}
Для каждого блока (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;