void RubiksCube::UpdatePositions() { if(m_moving) { struct timeval m_tv; gettimeofday(&m_tv, NULL); int new_time = m_tv.tv_usec; // time ranges from 0 -> 1000000 us int diff; if(new_time < m_start_time) { diff = (1000000 - m_start_time) + new_time; } else { diff = new_time - m_start_time; } int turns = floor(diff*90/(1000000*m_duration)); if(turns > 0) { if((m_angle + turns) >= 90*m_times) { turns = (90*m_times) - m_angle; } RotateSide(m_side, m_dir*turns); m_angle+= turns; // update start time // include diff so there is no accumilated error m_start_time = m_start_time + turns*(1000000*m_duration/90); if(m_start_time > 1000000) { m_start_time = 1000000 - m_start_time; } if(m_angle >= 90*m_times) { //printf("finished move on m_angle = %d\n", m_angle); m_moving = false; } } } }
//--------------------------------------------------------------------------------- // Interprets the final position of a twist and puts the data back onto the cube // Also sends twist data to thecubex solver, and manages scrambling/solving. //--------------------------------------------------------------------------------- void RubiksCube::FinishTwist() { // Count up rotations (quarter-twists) int rotation=Twist.rotation; rotation %= 360; if(rotation<0) rotation+=360; int rotations=rotation/90;//find the number of quarter-turns (moves) if(rotation % 90 > 45) rotations++; if(Twist.position==0 || Twist.position==3) { Twist.left.side=RotateSide(Twist.left.side, rotations); for(int i=0;i<rotations;i++) { RubikLine tmpline=Twist.left.line[3]; Twist.left.line[3]=Twist.left.line[2]; Twist.left.line[2]=Twist.left.line[1]; Twist.left.line[1]=Twist.left.line[0]; Twist.left.line[0]=tmpline; } } if(Twist.position==1 || Twist.position==3) { for(int i=0;i<rotations;i++) { RubikLine tmpline=Twist.middle.line[3]; Twist.middle.line[3]=Twist.middle.line[2]; Twist.middle.line[2]=Twist.middle.line[1]; Twist.middle.line[1]=Twist.middle.line[0]; Twist.middle.line[0]=tmpline; } } if(Twist.position==2 || Twist.position==3) { Twist.right.side=RotateSide(Twist.right.side, 4-rotations); for(int i=0;i<rotations;i++) { RubikLine tmpline=Twist.right.line[3]; Twist.right.line[3]=Twist.right.line[2]; Twist.right.line[2]=Twist.right.line[1]; Twist.right.line[1]=Twist.right.line[0]; Twist.right.line[0]=tmpline; } } Side[Twist.axis]=Twist.left.side; Side[Twist.axis + 3]=Twist.right.side; int one=((Twist.axis+1)%3)+3; int two=((Twist.axis+2)%3)+3; int three=(Twist.axis+1)%3; int four=(Twist.axis+2)%3; for(int i=0;i<3;i++) { Side[one].tile[2][2-i].color=Twist.left.line[0].tile[i].color; Side[one].tile[1][2-i].color=Twist.middle.line[0].tile[i].color; Side[one].tile[0][2-i].color=Twist.right.line[0].tile[i].color; Side[two].tile[i][2].color=Twist.left.line[1].tile[i].color; Side[two].tile[i][1].color=Twist.middle.line[1].tile[i].color; Side[two].tile[i][0].color=Twist.right.line[1].tile[i].color; Side[three].tile[0][i].color=Twist.left.line[2].tile[i].color; Side[three].tile[1][i].color=Twist.middle.line[2].tile[i].color; Side[three].tile[2][i].color=Twist.right.line[2].tile[i].color; Side[four].tile[i][2].color=Twist.left.line[3].tile[i].color; Side[four].tile[i][1].color=Twist.middle.line[3].tile[i].color; Side[four].tile[i][0].color=Twist.right.line[3].tile[i].color; } // Send the twist to cubex. switch(Twist.axis) { case 0: switch(Twist.position) { case 0: for(int i=0; i<rotations; i++) { solver.LD(); printf("LD\n"); } break; case 1: for(int i=0; i<rotations; i++) { solver.MD(); printf("MD\n"); } break; case 2: for(int i=0; i<rotations; i++) { solver.RD(); printf("RD\n"); } break; case 3: for(int i=0; i<rotations; i++) { solver.CD(); printf("CD\n"); } break; } break; case 1: switch(Twist.position) { case 0: for(int i=0; i<rotations; i++) { solver.DR(); printf("DR\n"); } break; case 1: for(int i=0; i<rotations; i++) { solver.MR(); printf("MR\n"); } break; case 2: for(int i=0; i<rotations; i++) { solver.UR(); printf("UR\n"); } break; case 3: for(int i=0; i<rotations; i++) { solver.CR(); printf("CR\n"); } break; } break; case 2: switch(Twist.position) { case 0: for(int i=0; i<rotations; i++) { solver.BA(); printf("BA\n"); } break; case 1: for(int i=0; i<rotations; i++) { solver.MA(); printf("MA\n"); } break; case 2: for(int i=0; i<rotations; i++) { solver.FA(); printf("FA\n"); } break; case 3: for(int i=0; i<rotations; i++) { solver.CA(); printf("CA\n"); } break; } break; } Twist.rotation=0; AutoTwisting=false; // handle scrambling if(Scrambling) { scramblecount--; if(scramblecount==0) Scrambling=false; } // or solving if(Solving) { solvecount--; if(solvecount==0) Solving = false; } }