Я пытаюсь создать Губку Менгера для назначения,
Изображение губки 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();
}
За каждый блок (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;
Других решений пока нет …