Я использую Processing 3D для разработки Rubik Cube. В функции leftUp()
я вращаю левую (синюю) грань и соответственно перемещаю квадраты. Каждое лицо - это класс, и каждый квадрат - это тоже класс.
Проблема в том, что когда я вызываю функцию rotateLeft
на гранях, некоторые квадраты становятся пустыми.
Я попытался отладить его, используя графические переводы, и обнаружил, что при каждом повороте некоторые квадраты складываются сами.
Это код для отображения лица:
void show()
{
int count = 0;
for( Square sq: squares)
{
pushMatrix();
translate(translates[0]+count, translates[1], translates[2]);
//count+=20;
rotateX(angles[0]);
rotateY(angles[1]);
rotateZ(angles[2]);
sq.show();
popMatrix();
}
}
Код для квадратного шоу:
void show()
{
pushMatrix();
fill(colour[0],colour[1],colour[2]);
beginShape();
vertex(x1,y1);
vertex(x2,y1);
vertex(x2,y2);
vertex(x1,y2);
endShape(CLOSE);
popMatrix();
}
Код для leftUp и rotateTop:
void leftUp()
{
faces[2].rotateLeft(1);
for(int i = 0; i < 3; i++)
{
Square temp = faces[3].squares[i*3];
faces[3].squares[i*3] = faces[0].squares[i*3];
faces[0].squares[i*3] = faces[5].squares[i*3];
faces[5].squares[i*3] = faces[4].squares[i*3];
faces[4].squares[i*3] = temp;
}
}
void rotateTop()
{
faces[3].rotateLeft(0);
for(int i = 0; i < 3; i++)
{
Square temp = faces[1].squares[i];
faces[1].squares[i] = faces[4].squares[i];
faces[4].squares[i] = faces[2].squares[i];
faces[2].squares[i] = faces[0].squares[i];
faces[0].squares[i] = temp;
}
}
Функция лица rotateLeft
:
void rotateLeft(int temper)
{
Square[] temp = new Square[9];
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
temp[3*i+j] = squares[(2-i)*3+j];
int[] tem = {i*100,0,0};
//if(temper==1) temp[3*i+j].colour = tem;
}
}
for(int i = 0; i < temp.length; i++)
{
squares[i] = temp[i];
println(faces[2].squares[i].colour);
}
}
Когда я звоню leftUp
, а затем rotateTop
или наоборот, возникает проблема. В чем может быть проблема?
Куб задачи:
Вы видите, что на левой грани 3 недостающих квадрата внизу.