40 |
40 |
{6,7,4,2,5,3,1,0}
|
41 |
41 |
};
|
42 |
42 |
|
43 |
|
private static boolean mUpper;
|
44 |
43 |
private static boolean mFixedEdgeIsDown;
|
45 |
44 |
private int[][] mAngles;
|
46 |
45 |
|
47 |
46 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
48 |
47 |
|
49 |
|
public static void setUpper(boolean upper, boolean isDown )
|
|
48 |
public static void setDown(boolean isDown )
|
50 |
49 |
{
|
51 |
|
mUpper = upper;
|
52 |
50 |
mFixedEdgeIsDown = isDown;
|
53 |
51 |
}
|
54 |
52 |
|
... | ... | |
56 |
54 |
// if upper==true, then the edge3 is the 'half-fixed' front edge. Remove it from the permutation.
|
57 |
55 |
// Otherwise edge1 is the one; remove it.
|
58 |
56 |
|
59 |
|
public static int[] edgePermTo7(int[] perm, boolean upper)
|
|
57 |
public static int[] edgePermTo7(int[] perm)
|
60 |
58 |
{
|
61 |
|
int val;
|
62 |
59 |
int[] ret = new int[7];
|
63 |
60 |
|
64 |
|
if( upper )
|
65 |
|
{
|
66 |
|
ret[0] = perm[0];
|
67 |
|
ret[1] = perm[1];
|
68 |
|
ret[2] = perm[2];
|
69 |
|
ret[3] = perm[4];
|
70 |
|
ret[4] = perm[5];
|
71 |
|
ret[5] = perm[6];
|
72 |
|
ret[6] = perm[7];
|
73 |
|
|
74 |
|
val = perm[3];
|
75 |
|
}
|
76 |
|
else
|
77 |
|
{
|
78 |
|
ret[0] = perm[0];
|
79 |
|
ret[1] = perm[2];
|
80 |
|
ret[2] = perm[3];
|
81 |
|
ret[3] = perm[4];
|
82 |
|
ret[4] = perm[5];
|
83 |
|
ret[5] = perm[6];
|
84 |
|
ret[6] = perm[7];
|
85 |
|
|
86 |
|
val = perm[1];
|
87 |
|
}
|
|
61 |
ret[0] = perm[0];
|
|
62 |
ret[1] = perm[2];
|
|
63 |
ret[2] = perm[3];
|
|
64 |
ret[3] = perm[4];
|
|
65 |
ret[4] = perm[5];
|
|
66 |
ret[5] = perm[6];
|
|
67 |
ret[6] = perm[7];
|
|
68 |
|
|
69 |
int val = perm[1];
|
88 |
70 |
|
89 |
71 |
for(int i=0; i<7; i++)
|
90 |
72 |
if( ret[i]>val ) ret[i]--;
|
... | ... | |
97 |
79 |
private static int[] edgePermTo8(int[] perm, boolean inPlace)
|
98 |
80 |
{
|
99 |
81 |
int[] ret = new int[8];
|
|
82 |
int val = inPlace ? 1:3;
|
100 |
83 |
|
101 |
|
if( mUpper )
|
102 |
|
{
|
103 |
|
int val = inPlace ? 3:1;
|
104 |
|
ret[0] = perm[0]; if( ret[0]>=val ) ret[0]++;
|
105 |
|
ret[1] = perm[1]; if( ret[1]>=val ) ret[1]++;
|
106 |
|
ret[2] = perm[2]; if( ret[2]>=val ) ret[2]++;
|
107 |
|
ret[3] = val;
|
108 |
|
ret[4] = perm[3]; if( ret[4]>=val ) ret[4]++;
|
109 |
|
ret[5] = perm[4]; if( ret[5]>=val ) ret[5]++;
|
110 |
|
ret[6] = perm[5]; if( ret[6]>=val ) ret[6]++;
|
111 |
|
ret[7] = perm[6]; if( ret[7]>=val ) ret[7]++;
|
112 |
|
}
|
113 |
|
else
|
114 |
|
{
|
115 |
|
int val = inPlace ? 1:3;
|
116 |
|
ret[0] = perm[0]; if( ret[0]>=val ) ret[0]++;
|
117 |
|
ret[1] = val;
|
118 |
|
ret[2] = perm[1]; if( ret[2]>=val ) ret[2]++;
|
119 |
|
ret[3] = perm[2]; if( ret[3]>=val ) ret[3]++;
|
120 |
|
ret[4] = perm[3]; if( ret[4]>=val ) ret[4]++;
|
121 |
|
ret[5] = perm[4]; if( ret[5]>=val ) ret[5]++;
|
122 |
|
ret[6] = perm[5]; if( ret[6]>=val ) ret[6]++;
|
123 |
|
ret[7] = perm[6]; if( ret[7]>=val ) ret[7]++;
|
124 |
|
}
|
|
84 |
ret[0] = perm[0]; if( ret[0]>=val ) ret[0]++;
|
|
85 |
ret[1] = val;
|
|
86 |
ret[2] = perm[1]; if( ret[2]>=val ) ret[2]++;
|
|
87 |
ret[3] = perm[2]; if( ret[3]>=val ) ret[3]++;
|
|
88 |
ret[4] = perm[3]; if( ret[4]>=val ) ret[4]++;
|
|
89 |
ret[5] = perm[4]; if( ret[5]>=val ) ret[5]++;
|
|
90 |
ret[6] = perm[5]; if( ret[6]>=val ) ret[6]++;
|
|
91 |
ret[7] = perm[6]; if( ret[7]>=val ) ret[7]++;
|
125 |
92 |
|
126 |
93 |
return ret;
|
127 |
94 |
}
|
... | ... | |
137 |
104 |
|
138 |
105 |
public TBCuboid323(OperatingSystemInterface os)
|
139 |
106 |
{
|
140 |
|
super(os,new int[] {R.raw.cu_323_pruning6,R.raw.cu_323_pruning7}, new int[] {R.raw.cu_323_pruning17,R.raw.cu_323_pruning18});
|
|
107 |
super(os,new int[] {R.raw.cu_323_pruning6,R.raw.cu_323_pruning7}, null);//new int[] {R.raw.cu_323_pruning17,R.raw.cu_323_pruning18});
|
141 |
108 |
}
|
142 |
109 |
|
143 |
110 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
... | ... | |
214 |
181 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
215 |
182 |
// we can never really move the fixed front edge, because if we do so, we would also rotate the
|
216 |
183 |
// rotation axis themselves! (see getIndex() where the cubit quats are normalized)
|
217 |
|
// Fixed front edge is always iin the front, up or down (depending on value of mFixedEdgeIsDown)
|
|
184 |
// Fixed front edge is always in the front, up or down (depending on value of mFixedEdgeIsDown)
|
218 |
185 |
// If the edge is up and we are moving along Y axis, invert!
|
219 |
186 |
|
220 |
187 |
@Override
|
... | ... | |
255 |
222 |
|
256 |
223 |
int[] getHighPruningLevels()
|
257 |
224 |
{
|
258 |
|
return new int[] {17,18};
|
|
225 |
return null;//new int[] {17,18};
|
259 |
226 |
}
|
260 |
227 |
|
261 |
228 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
... | ... | |
286 |
253 |
|
287 |
254 |
private boolean isFrontEdgeInItsPlace(int[] perm)
|
288 |
255 |
{
|
289 |
|
int index = mUpper?3:1;
|
290 |
|
return perm[index]==index;
|
|
256 |
return perm[1]==1;
|
291 |
257 |
}
|
292 |
258 |
|
293 |
259 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
294 |
260 |
|
295 |
261 |
private void correctQuats(int[] quats)
|
296 |
262 |
{
|
297 |
|
int mult=0, index = mUpper? 11:9;
|
|
263 |
int mult=0;
|
298 |
264 |
|
299 |
|
switch(quats[index])
|
|
265 |
switch(quats[9])
|
300 |
266 |
{
|
301 |
267 |
case 0: case 5: return;
|
302 |
268 |
case 4: case 7: mult=2; break;
|
... | ... | |
353 |
319 |
edge_perm8[i] = findIndex( EDGE_MAP[i] , quats[i+8]);
|
354 |
320 |
}
|
355 |
321 |
|
356 |
|
int[] edge_perm7 = edgePermTo7(edge_perm8,mUpper);
|
|
322 |
int[] edge_perm7 = edgePermTo7(edge_perm8);
|
357 |
323 |
|
358 |
324 |
int corner_perm_num = TablebaseHelpers.computePermutationNum(corner_perm);
|
359 |
325 |
int edge_perm_num = TablebaseHelpers.computePermutationNum(edge_perm7);
|
CU_323 solver: remove mUpper.