Почему вращение кубика рубика оставляет пустые квадраты? - PullRequest
0 голосов
/ 03 января 2019

Я использую Processing 3D для разработки Rubik Cube. В функции leftUp() я вращаю левую (синюю) грань и соответственно перемещаю квадраты. Каждое лицо - это класс, и каждый квадрат - это тоже класс. Проблема в том, что когда я вызываю функцию rotateLeft на гранях, некоторые квадраты становятся пустыми.

Я попытался отладить его, используя графические переводы, и обнаружил, что при каждом повороте некоторые квадраты складываются сами. Correct orientation Erroneous orientation

Это код для отображения лица:

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 или наоборот, возникает проблема. В чем может быть проблема?

Куб задачи:

enter image description here

Вы видите, что на левой грани 3 недостающих квадрата внизу.

...