aboutsummaryrefslogtreecommitdiff
path: root/src/trans.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/trans.c')
-rw-r--r--src/trans.c190
1 files changed, 0 insertions, 190 deletions
diff --git a/src/trans.c b/src/trans.c
deleted file mode 100644
index 898c2be..0000000
--- a/src/trans.c
+++ /dev/null
@@ -1,190 +0,0 @@
1#define TRANS_C
2
3#include "trans.h"
4
5/* Local functions ***********************************************************/
6
7/* Tables and other data *****************************************************/
8
9static Cube mirror_cube = {
10.ep = { [UF] = UF, [UL] = UR, [UB] = UB, [UR] = UL,
11 [DF] = DF, [DL] = DR, [DB] = DB, [DR] = DL,
12 [FR] = FL, [FL] = FR, [BL] = BR, [BR] = BL },
13.cp = { [UFR] = UFL, [UFL] = UFR, [UBL] = UBR, [UBR] = UBL,
14 [DFR] = DFL, [DFL] = DFR, [DBL] = DBR, [DBR] = DBL },
15.xp = { [U_center] = U_center, [D_center] = D_center,
16 [R_center] = L_center, [L_center] = R_center,
17 [F_center] = F_center, [B_center] = B_center }
18};
19
20static char rotation_alg_string[100][NROTATIONS] = {
21 [uf] = "", [ur] = "y", [ub] = "y2", [ul] = "y3",
22 [df] = "z2", [dr] = "y z2", [db] = "x2", [dl] = "y3 z2",
23 [rf] = "z3", [rd] = "z3 y", [rb] = "z3 y2", [ru] = "z3 y3",
24 [lf] = "z", [ld] = "z y3", [lb] = "z y2", [lu] = "z y",
25 [fu] = "x y2", [fr] = "x y", [fd] = "x", [fl] = "x y3",
26 [bu] = "x3", [br] = "x3 y", [bd] = "x3 y2", [bl] = "x3 y3",
27};
28
29Alg *rotation_alg_arr[NROTATIONS];
30Move moves_ttable[NTRANS][NMOVES];
31Trans trans_ttable[NTRANS][NTRANS];
32Trans trans_itable[NTRANS];
33
34/* Public functions **********************************************************/
35
36void
37apply_trans(Trans t, Cube *cube)
38{
39 Cube aux;
40 Alg *inv;
41 int i;
42
43 inv = inverse_alg(rotation_alg(t % NROTATIONS));
44 copy_cube(cube, &aux);
45 make_solved(cube);
46
47 if (t >= NROTATIONS)
48 compose(&mirror_cube, cube);
49 apply_alg(inv, cube);
50 compose(&aux, cube);
51 apply_alg(rotation_alg(t % NROTATIONS), cube);
52 if (t >= NROTATIONS) {
53 compose(&mirror_cube, cube);
54 for (i = 0; i < 8; i++)
55 cube->co[i] = (3 - cube->co[i]) % 3;
56 }
57
58 free_alg(inv);
59}
60
61/*
62Trans
63inverse_trans(Trans t)
64{
65 static Trans inverse_trans_aux[NTRANS] = {
66 [uf] = uf, [ur] = ul, [ul] = ur, [ub] = ub,
67 [df] = df, [dr] = dr, [dl] = dl, [db] = db,
68 [rf] = lf, [rd] = bl, [rb] = rb, [ru] = fr,
69 [lf] = rf, [ld] = br, [lb] = lb, [lu] = fl,
70 [fu] = fu, [fr] = ru, [fd] = bu, [fl] = lu,
71 [bu] = fd, [br] = ld, [bd] = bd, [bl] = rd,
72
73 [uf_mirror] = uf_mirror, [ur_mirror] = ur_mirror,
74 [ul_mirror] = ul_mirror, [ub_mirror] = ub_mirror,
75 [df_mirror] = df_mirror, [dr_mirror] = dl_mirror,
76 [dl_mirror] = dr_mirror, [db_mirror] = db_mirror,
77 [rf_mirror] = rf_mirror, [rd_mirror] = br_mirror,
78 [rb_mirror] = lb_mirror, [ru_mirror] = fl_mirror,
79 [lf_mirror] = lf_mirror, [ld_mirror] = bl_mirror,
80 [lb_mirror] = rb_mirror, [lu_mirror] = fr_mirror,
81 [fu_mirror] = fu_mirror, [fr_mirror] = lu_mirror,
82 [fd_mirror] = bu_mirror, [fl_mirror] = ru_mirror,
83 [bu_mirror] = fd_mirror, [br_mirror] = rd_mirror,
84 [bd_mirror] = bd_mirror, [bl_mirror] = ld_mirror
85 };
86
87 return inverse_trans_aux[t];
88}
89*/
90
91Trans
92inverse_trans(Trans t)
93{
94 return trans_itable[t];
95}
96
97Alg *
98rotation_alg(Trans i)
99{
100 return rotation_alg_arr[i % NROTATIONS];
101}
102
103void
104transform_alg(Trans t, Alg *alg)
105{
106 int i;
107
108 for (i = 0; i < alg->len; i++)
109 alg->move[i] = transform_move(t, alg->move[i]);
110}
111
112Move
113transform_move(Trans t, Move m)
114{
115 return moves_ttable[t][m];
116}
117
118Trans
119transform_trans(Trans t, Trans m)
120{
121 return trans_ttable[t][m];
122}
123
124void
125init_trans() {
126 static bool initialized = false;
127 if (initialized)
128 return;
129 initialized = true;
130
131 int i;
132 Alg *nonsym_alg, *nonsym_inv;
133 Cube aux, cube;
134 Move mi, move;
135 Trans t, u, v;
136
137 init_moves();
138
139 for (i = 0; i < NROTATIONS; i++)
140 rotation_alg_arr[i] = new_alg(rotation_alg_string[i]);
141
142 for (t = 0; t < NTRANS; t++) {
143 for (mi = 0; mi < NMOVES; mi++) {
144 make_solved(&aux);
145 apply_move(mi, &aux);
146 apply_trans(t, &aux);
147 for (move = 0; move < NMOVES; move++) {
148 copy_cube(&aux, &cube);
149 apply_move(inverse_move(move), &cube);
150 if (is_solved(&cube)) {
151 moves_ttable[t][mi] = move;
152 break;
153 }
154 }
155 }
156 }
157
158 nonsym_alg = new_alg("R' U' F");
159 nonsym_inv = inverse_alg(nonsym_alg);
160
161 for (t = 0; t < NTRANS; t++) {
162 for (u = 0; u < NTRANS; u++) {
163 make_solved(&aux);
164 apply_alg(nonsym_alg, &aux);
165 apply_trans(u, &aux);
166 apply_trans(t, &aux);
167 for (v = 0; v < NTRANS; v++) {
168 copy_cube(&aux, &cube);
169 apply_trans(v, &cube);
170 apply_alg(nonsym_inv, &cube);
171 if (is_solved(&cube)) {
172 /* This is the inverse of the correct
173 value, it will be inverted later */
174 trans_ttable[t][u] = v;
175 if (v == uf)
176 trans_itable[t] = u;
177 break;
178 }
179 }
180 }
181 }
182 for (t = 0; t < NTRANS; t++)
183 for (u = 0; u < NTRANS; u++)
184 trans_ttable[t][u] = trans_itable[trans_ttable[t][u]];
185
186
187 free_alg(nonsym_alg);
188 free_alg(nonsym_inv);
189}
190

Generated with cgit - Back to sebastiano.tronto.net