rubiks_transform.c 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include <string.h>
  2. #include "rubiks.h"
  3. void rubik_applyX(t_rubiks *rubiks, char move[3])
  4. {
  5. char tmpMatrix[3][3];
  6. memcpy(tmpMatrix, rubiks->grid[3], sizeof(tmpMatrix));
  7. memcpy(rubiks->grid[3], rubiks->grid[5], sizeof(tmpMatrix));
  8. memcpy(rubiks->grid[5], rubiks->grid[1], sizeof(tmpMatrix));
  9. memcpy(rubiks->grid[1], rubiks->grid[0], sizeof(tmpMatrix));
  10. memcpy(rubiks->grid[0], tmpMatrix, sizeof(tmpMatrix));
  11. memcpy(tmpMatrix, rubiks->grid[2], sizeof(tmpMatrix));
  12. rubiks->grid[2][0][0] = tmpMatrix[0][2];
  13. rubiks->grid[2][0][1] = tmpMatrix[1][2];
  14. rubiks->grid[2][0][2] = tmpMatrix[2][2];
  15. rubiks->grid[2][1][0] = tmpMatrix[0][1];
  16. rubiks->grid[2][1][1] = tmpMatrix[1][1];
  17. rubiks->grid[2][1][2] = tmpMatrix[2][1];
  18. rubiks->grid[2][2][0] = tmpMatrix[0][0];
  19. rubiks->grid[2][2][1] = tmpMatrix[1][0];
  20. rubiks->grid[2][2][2] = tmpMatrix[2][0];
  21. memcpy(tmpMatrix, rubiks->grid[4], sizeof(tmpMatrix));
  22. rubiks->grid[4][0][0] = tmpMatrix[2][0];
  23. rubiks->grid[4][1][0] = tmpMatrix[2][1];
  24. rubiks->grid[4][2][0] = tmpMatrix[2][2];
  25. rubiks->grid[4][0][1] = tmpMatrix[1][0];
  26. rubiks->grid[4][1][1] = tmpMatrix[1][1];
  27. rubiks->grid[4][2][1] = tmpMatrix[1][2];
  28. rubiks->grid[4][0][2] = tmpMatrix[0][0];
  29. rubiks->grid[4][1][2] = tmpMatrix[0][1];
  30. rubiks->grid[4][2][2] = tmpMatrix[0][2];
  31. memcpy(tmpMatrix, rubiks->grid[3], sizeof(tmpMatrix));
  32. rubiks->grid[3][0][0] = tmpMatrix[2][2];
  33. rubiks->grid[3][1][0] = tmpMatrix[1][2];
  34. rubiks->grid[3][2][0] = tmpMatrix[0][2];
  35. rubiks->grid[3][0][1] = tmpMatrix[2][1];
  36. rubiks->grid[3][1][1] = tmpMatrix[1][1];
  37. rubiks->grid[3][2][1] = tmpMatrix[0][1];
  38. rubiks->grid[3][0][2] = tmpMatrix[2][0];
  39. rubiks->grid[3][1][2] = tmpMatrix[1][0];
  40. rubiks->grid[3][2][2] = tmpMatrix[0][0];
  41. rubik_applyZ(rubiks, (char [3]) { 'Z', move[1], move[2] == '+' ? '-' : '+' });
  42. memcpy(tmpMatrix, rubiks->grid[0], sizeof(tmpMatrix));
  43. memcpy(rubiks->grid[0], rubiks->grid[1], sizeof(tmpMatrix));
  44. memcpy(rubiks->grid[1], rubiks->grid[5], sizeof(tmpMatrix));
  45. memcpy(rubiks->grid[5], rubiks->grid[3], sizeof(tmpMatrix));
  46. memcpy(rubiks->grid[3], tmpMatrix, sizeof(tmpMatrix));
  47. memcpy(tmpMatrix, rubiks->grid[2], sizeof(tmpMatrix));
  48. rubiks->grid[2][0][0] = tmpMatrix[2][0];
  49. rubiks->grid[2][1][0] = tmpMatrix[2][1];
  50. rubiks->grid[2][2][0] = tmpMatrix[2][2];
  51. rubiks->grid[2][0][1] = tmpMatrix[1][0];
  52. rubiks->grid[2][1][1] = tmpMatrix[1][1];
  53. rubiks->grid[2][2][1] = tmpMatrix[1][2];
  54. rubiks->grid[2][0][2] = tmpMatrix[0][0];
  55. rubiks->grid[2][1][2] = tmpMatrix[0][1];
  56. rubiks->grid[2][2][2] = tmpMatrix[0][2];
  57. memcpy(tmpMatrix, rubiks->grid[4], sizeof(tmpMatrix));
  58. rubiks->grid[4][0][0] = tmpMatrix[0][2];
  59. rubiks->grid[4][1][0] = tmpMatrix[0][1];
  60. rubiks->grid[4][2][0] = tmpMatrix[0][0];
  61. rubiks->grid[4][0][1] = tmpMatrix[1][2];
  62. rubiks->grid[4][1][1] = tmpMatrix[1][1];
  63. rubiks->grid[4][2][1] = tmpMatrix[1][0];
  64. rubiks->grid[4][0][2] = tmpMatrix[0][2];
  65. rubiks->grid[4][1][2] = tmpMatrix[0][1];
  66. rubiks->grid[4][2][2] = tmpMatrix[0][0];
  67. memcpy(tmpMatrix, rubiks->grid[5], sizeof(tmpMatrix));
  68. rubiks->grid[5][0][0] = tmpMatrix[2][2];
  69. rubiks->grid[5][1][0] = tmpMatrix[1][2];
  70. rubiks->grid[5][2][0] = tmpMatrix[0][2];
  71. rubiks->grid[5][0][1] = tmpMatrix[2][1];
  72. rubiks->grid[5][1][1] = tmpMatrix[1][1];
  73. rubiks->grid[5][2][1] = tmpMatrix[0][1];
  74. rubiks->grid[5][0][2] = tmpMatrix[2][0];
  75. rubiks->grid[5][1][2] = tmpMatrix[1][0];
  76. rubiks->grid[5][2][2] = tmpMatrix[0][0];
  77. }
  78. void rubik_applyY(t_rubiks *rubiks, char move[3])
  79. {
  80. /* TODO */
  81. (void)rubiks;
  82. (void)move;
  83. }
  84. void rubik_applyZ(t_rubiks *rubiks, char move[3])
  85. {
  86. char tmp;
  87. char tmpv[3];
  88. const char axis = move[1] - '0';
  89. if (move[2] == '-')
  90. {
  91. int i;
  92. for (i=0; i < 3; ++i)
  93. rubik_applyZ(rubiks, (char [3]) { move[0], move[1], '+' });
  94. return;
  95. }
  96. if (axis == 0)
  97. {
  98. tmp = rubiks->grid[0][0][0];
  99. rubiks->grid[0][0][0] = rubiks->grid[0][0][2];
  100. rubiks->grid[0][0][2] = rubiks->grid[0][2][2];
  101. rubiks->grid[0][2][2] = rubiks->grid[0][2][0];
  102. rubiks->grid[0][2][0] = tmp;
  103. tmp = rubiks->grid[0][1][0];
  104. rubiks->grid[0][1][0] = rubiks->grid[0][0][1];
  105. rubiks->grid[0][0][1] = rubiks->grid[0][1][2];
  106. rubiks->grid[0][1][2] = rubiks->grid[0][2][1];
  107. rubiks->grid[0][2][1] = tmp;
  108. memcpy(tmpv, (char[3]) { rubiks->grid[1][0][0], rubiks->grid[1][0][1], rubiks->grid[1][0][2] }, sizeof(tmpv) * 3);
  109. rubiks->grid[1][0][0] = rubiks->grid[4][0][2];
  110. rubiks->grid[1][0][1] = rubiks->grid[4][1][2];
  111. rubiks->grid[1][0][2] = rubiks->grid[4][2][2];
  112. rubiks->grid[4][0][2] = rubiks->grid[3][2][2];
  113. rubiks->grid[4][1][2] = rubiks->grid[3][2][1];
  114. rubiks->grid[4][2][2] = rubiks->grid[3][2][0];
  115. rubiks->grid[3][2][0] = rubiks->grid[2][0][0];
  116. rubiks->grid[3][2][1] = rubiks->grid[2][1][0];
  117. rubiks->grid[3][2][2] = rubiks->grid[2][2][0];
  118. rubiks->grid[2][0][0] = tmpv[2];
  119. rubiks->grid[2][1][0] = tmpv[1];
  120. rubiks->grid[2][2][0] = tmpv[0];
  121. }
  122. else if (axis == 1)
  123. {
  124. memcpy(tmpv, (char[3]) { rubiks->grid[1][1][0], rubiks->grid[1][1][1], rubiks->grid[1][1][2] }, sizeof(tmpv) * 3);
  125. rubiks->grid[1][1][0] = rubiks->grid[4][0][1];
  126. rubiks->grid[1][1][1] = rubiks->grid[4][1][1];
  127. rubiks->grid[1][1][2] = rubiks->grid[4][2][1];
  128. rubiks->grid[4][0][1] = rubiks->grid[3][1][2];
  129. rubiks->grid[4][1][1] = rubiks->grid[3][1][1];
  130. rubiks->grid[4][2][1] = rubiks->grid[3][1][0];
  131. rubiks->grid[3][1][0] = rubiks->grid[2][0][1];
  132. rubiks->grid[3][1][1] = rubiks->grid[2][1][1];
  133. rubiks->grid[3][1][2] = rubiks->grid[2][2][1];
  134. rubiks->grid[2][0][1] = tmpv[2];
  135. rubiks->grid[2][1][1] = tmpv[1];
  136. rubiks->grid[2][2][1] = tmpv[0];
  137. }
  138. else if (axis == 2)
  139. {
  140. memcpy(tmpv, (char[3]) { rubiks->grid[1][2][0], rubiks->grid[1][2][1], rubiks->grid[1][2][2] }, sizeof(tmpv) * 3);
  141. rubiks->grid[1][2][0] = rubiks->grid[4][0][0];
  142. rubiks->grid[1][2][1] = rubiks->grid[4][1][0];
  143. rubiks->grid[1][2][2] = rubiks->grid[4][2][0];
  144. rubiks->grid[4][0][0] = rubiks->grid[3][0][2];
  145. rubiks->grid[4][1][0] = rubiks->grid[3][0][1];
  146. rubiks->grid[4][2][0] = rubiks->grid[3][0][0];
  147. rubiks->grid[3][0][0] = rubiks->grid[2][0][2];
  148. rubiks->grid[3][0][1] = rubiks->grid[2][1][2];
  149. rubiks->grid[3][0][2] = rubiks->grid[2][2][2];
  150. rubiks->grid[2][0][2] = tmpv[2];
  151. rubiks->grid[2][1][2] = tmpv[1];
  152. rubiks->grid[2][2][2] = tmpv[0];
  153. tmp = rubiks->grid[5][0][0];
  154. rubiks->grid[5][0][0] = rubiks->grid[5][0][2];
  155. rubiks->grid[5][0][2] = rubiks->grid[5][2][2];
  156. rubiks->grid[5][2][2] = rubiks->grid[5][2][0];
  157. rubiks->grid[5][2][0] = tmp;
  158. tmp = rubiks->grid[5][1][0];
  159. rubiks->grid[5][1][0] = rubiks->grid[5][0][1];
  160. rubiks->grid[5][0][1] = rubiks->grid[5][1][2];
  161. rubiks->grid[5][1][2] = rubiks->grid[5][2][1];
  162. rubiks->grid[5][2][1] = tmp;
  163. }
  164. }