rubiks_transform.c 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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[2][2];
  65. rubiks->grid[4][1][2] = tmpMatrix[2][1];
  66. rubiks->grid[4][2][2] = tmpMatrix[2][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. char tmpMatrix[3][3];
  81. memcpy(tmpMatrix, rubiks->grid[5], sizeof(tmpMatrix));
  82. memcpy(rubiks->grid[5], rubiks->grid[4], sizeof(tmpMatrix));
  83. memcpy(rubiks->grid[4], rubiks->grid[0], sizeof(tmpMatrix));
  84. memcpy(rubiks->grid[0], rubiks->grid[2], sizeof(tmpMatrix));
  85. memcpy(rubiks->grid[2], tmpMatrix, sizeof(tmpMatrix));
  86. memcpy(tmpMatrix, rubiks->grid[1], sizeof(tmpMatrix));
  87. rubiks->grid[1][0][0] = tmpMatrix[0][2];
  88. rubiks->grid[1][0][1] = tmpMatrix[1][2];
  89. rubiks->grid[1][0][2] = tmpMatrix[2][2];
  90. rubiks->grid[1][1][0] = tmpMatrix[0][1];
  91. rubiks->grid[1][1][1] = tmpMatrix[1][1];
  92. rubiks->grid[1][1][2] = tmpMatrix[2][1];
  93. rubiks->grid[1][2][0] = tmpMatrix[0][0];
  94. rubiks->grid[1][2][1] = tmpMatrix[1][0];
  95. rubiks->grid[1][2][2] = tmpMatrix[2][0];
  96. memcpy(tmpMatrix, rubiks->grid[3], sizeof(tmpMatrix));
  97. rubiks->grid[3][0][0] = tmpMatrix[2][0];
  98. rubiks->grid[3][1][0] = tmpMatrix[2][1];
  99. rubiks->grid[3][2][0] = tmpMatrix[2][2];
  100. rubiks->grid[3][0][1] = tmpMatrix[1][0];
  101. rubiks->grid[3][1][1] = tmpMatrix[1][1];
  102. rubiks->grid[3][2][1] = tmpMatrix[1][2];
  103. rubiks->grid[3][0][2] = tmpMatrix[0][0];
  104. rubiks->grid[3][1][2] = tmpMatrix[0][1];
  105. rubiks->grid[3][2][2] = tmpMatrix[0][2];
  106. memcpy(tmpMatrix, rubiks->grid[2], sizeof(tmpMatrix));
  107. rubiks->grid[2][0][0] = tmpMatrix[2][2];
  108. rubiks->grid[2][1][0] = tmpMatrix[1][2];
  109. rubiks->grid[2][2][0] = tmpMatrix[0][2];
  110. rubiks->grid[2][0][1] = tmpMatrix[2][1];
  111. rubiks->grid[2][1][1] = tmpMatrix[1][1];
  112. rubiks->grid[2][2][1] = tmpMatrix[0][1];
  113. rubiks->grid[2][0][2] = tmpMatrix[2][0];
  114. rubiks->grid[2][1][2] = tmpMatrix[1][0];
  115. rubiks->grid[2][2][2] = tmpMatrix[0][0];
  116. rubik_applyZ(rubiks, (char [3]) { 'Z', move[1], move[2] });
  117. memcpy(tmpMatrix, rubiks->grid[0], sizeof(tmpMatrix));
  118. memcpy(rubiks->grid[0], rubiks->grid[4], sizeof(tmpMatrix));
  119. memcpy(rubiks->grid[4], rubiks->grid[5], sizeof(tmpMatrix));
  120. memcpy(rubiks->grid[5], rubiks->grid[2], sizeof(tmpMatrix));
  121. memcpy(rubiks->grid[2], tmpMatrix, sizeof(tmpMatrix));
  122. memcpy(tmpMatrix, rubiks->grid[1], sizeof(tmpMatrix));
  123. rubiks->grid[1][0][0] = tmpMatrix[2][0];
  124. rubiks->grid[1][1][0] = tmpMatrix[2][1];
  125. rubiks->grid[1][2][0] = tmpMatrix[2][2];
  126. rubiks->grid[1][0][1] = tmpMatrix[1][0];
  127. rubiks->grid[1][1][1] = tmpMatrix[1][1];
  128. rubiks->grid[1][2][1] = tmpMatrix[1][2];
  129. rubiks->grid[1][0][2] = tmpMatrix[0][0];
  130. rubiks->grid[1][1][2] = tmpMatrix[0][1];
  131. rubiks->grid[1][2][2] = tmpMatrix[0][2];
  132. memcpy(tmpMatrix, rubiks->grid[3], sizeof(tmpMatrix));
  133. rubiks->grid[3][0][0] = tmpMatrix[0][2];
  134. rubiks->grid[3][1][0] = tmpMatrix[0][1];
  135. rubiks->grid[3][2][0] = tmpMatrix[0][0];
  136. rubiks->grid[3][0][1] = tmpMatrix[1][2];
  137. rubiks->grid[3][1][1] = tmpMatrix[1][1];
  138. rubiks->grid[3][2][1] = tmpMatrix[1][0];
  139. rubiks->grid[3][0][2] = tmpMatrix[2][2];
  140. rubiks->grid[3][1][2] = tmpMatrix[2][1];
  141. rubiks->grid[3][2][2] = tmpMatrix[2][0];
  142. memcpy(tmpMatrix, rubiks->grid[5], sizeof(tmpMatrix));
  143. rubiks->grid[5][0][0] = tmpMatrix[2][2];
  144. rubiks->grid[5][1][0] = tmpMatrix[1][2];
  145. rubiks->grid[5][2][0] = tmpMatrix[0][2];
  146. rubiks->grid[5][0][1] = tmpMatrix[2][1];
  147. rubiks->grid[5][1][1] = tmpMatrix[1][1];
  148. rubiks->grid[5][2][1] = tmpMatrix[0][1];
  149. rubiks->grid[5][0][2] = tmpMatrix[2][0];
  150. rubiks->grid[5][1][2] = tmpMatrix[1][0];
  151. rubiks->grid[5][2][2] = tmpMatrix[0][0];
  152. }
  153. void rubik_applyZ(t_rubiks *rubiks, char move[3])
  154. {
  155. char tmp;
  156. char tmpv[3];
  157. const char axis = move[1] - '0';
  158. if (move[2] == '-')
  159. {
  160. int i;
  161. for (i=0; i < 3; ++i)
  162. rubik_applyZ(rubiks, (char [3]) { move[0], move[1], '+' });
  163. return;
  164. }
  165. if (axis == 0)
  166. {
  167. tmp = rubiks->grid[0][0][0];
  168. rubiks->grid[0][0][0] = rubiks->grid[0][0][2];
  169. rubiks->grid[0][0][2] = rubiks->grid[0][2][2];
  170. rubiks->grid[0][2][2] = rubiks->grid[0][2][0];
  171. rubiks->grid[0][2][0] = tmp;
  172. tmp = rubiks->grid[0][1][0];
  173. rubiks->grid[0][1][0] = rubiks->grid[0][0][1];
  174. rubiks->grid[0][0][1] = rubiks->grid[0][1][2];
  175. rubiks->grid[0][1][2] = rubiks->grid[0][2][1];
  176. rubiks->grid[0][2][1] = tmp;
  177. memcpy(tmpv, (char[3]) { rubiks->grid[1][0][0], rubiks->grid[1][0][1], rubiks->grid[1][0][2] }, sizeof(tmpv) * 3);
  178. rubiks->grid[1][0][0] = rubiks->grid[4][0][2];
  179. rubiks->grid[1][0][1] = rubiks->grid[4][1][2];
  180. rubiks->grid[1][0][2] = rubiks->grid[4][2][2];
  181. rubiks->grid[4][0][2] = rubiks->grid[3][2][2];
  182. rubiks->grid[4][1][2] = rubiks->grid[3][2][1];
  183. rubiks->grid[4][2][2] = rubiks->grid[3][2][0];
  184. rubiks->grid[3][2][0] = rubiks->grid[2][0][0];
  185. rubiks->grid[3][2][1] = rubiks->grid[2][1][0];
  186. rubiks->grid[3][2][2] = rubiks->grid[2][2][0];
  187. rubiks->grid[2][0][0] = tmpv[2];
  188. rubiks->grid[2][1][0] = tmpv[1];
  189. rubiks->grid[2][2][0] = tmpv[0];
  190. }
  191. else if (axis == 1)
  192. {
  193. memcpy(tmpv, (char[3]) { rubiks->grid[1][1][0], rubiks->grid[1][1][1], rubiks->grid[1][1][2] }, sizeof(tmpv) * 3);
  194. rubiks->grid[1][1][0] = rubiks->grid[4][0][1];
  195. rubiks->grid[1][1][1] = rubiks->grid[4][1][1];
  196. rubiks->grid[1][1][2] = rubiks->grid[4][2][1];
  197. rubiks->grid[4][0][1] = rubiks->grid[3][1][2];
  198. rubiks->grid[4][1][1] = rubiks->grid[3][1][1];
  199. rubiks->grid[4][2][1] = rubiks->grid[3][1][0];
  200. rubiks->grid[3][1][0] = rubiks->grid[2][0][1];
  201. rubiks->grid[3][1][1] = rubiks->grid[2][1][1];
  202. rubiks->grid[3][1][2] = rubiks->grid[2][2][1];
  203. rubiks->grid[2][0][1] = tmpv[2];
  204. rubiks->grid[2][1][1] = tmpv[1];
  205. rubiks->grid[2][2][1] = tmpv[0];
  206. }
  207. else if (axis == 2)
  208. {
  209. memcpy(tmpv, (char[3]) { rubiks->grid[1][2][0], rubiks->grid[1][2][1], rubiks->grid[1][2][2] }, sizeof(tmpv) * 3);
  210. rubiks->grid[1][2][0] = rubiks->grid[4][0][0];
  211. rubiks->grid[1][2][1] = rubiks->grid[4][1][0];
  212. rubiks->grid[1][2][2] = rubiks->grid[4][2][0];
  213. rubiks->grid[4][0][0] = rubiks->grid[3][0][2];
  214. rubiks->grid[4][1][0] = rubiks->grid[3][0][1];
  215. rubiks->grid[4][2][0] = rubiks->grid[3][0][0];
  216. rubiks->grid[3][0][0] = rubiks->grid[2][0][2];
  217. rubiks->grid[3][0][1] = rubiks->grid[2][1][2];
  218. rubiks->grid[3][0][2] = rubiks->grid[2][2][2];
  219. rubiks->grid[2][0][2] = tmpv[2];
  220. rubiks->grid[2][1][2] = tmpv[1];
  221. rubiks->grid[2][2][2] = tmpv[0];
  222. tmp = rubiks->grid[5][0][0];
  223. rubiks->grid[5][0][0] = rubiks->grid[5][0][2];
  224. rubiks->grid[5][0][2] = rubiks->grid[5][2][2];
  225. rubiks->grid[5][2][2] = rubiks->grid[5][2][0];
  226. rubiks->grid[5][2][0] = tmp;
  227. tmp = rubiks->grid[5][1][0];
  228. rubiks->grid[5][1][0] = rubiks->grid[5][0][1];
  229. rubiks->grid[5][0][1] = rubiks->grid[5][1][2];
  230. rubiks->grid[5][1][2] = rubiks->grid[5][2][1];
  231. rubiks->grid[5][2][1] = tmp;
  232. }
  233. }