opengl — алгоритм Менгера Губки в переполнении стека

Я пытаюсь создать Губку Менгера для назначения,

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

и на данный момент у меня есть 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

Решение

За каждый блок (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;
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]