1 |
41ce784b
|
Leszek Koltunski
|
/*
|
2 |
|
|
* Herbert Kociemba
|
3 |
|
|
*
|
4 |
|
|
* BSD-licensed. See https://opensource.org/licenses/BSD-3-Clause
|
5 |
|
|
*/
|
6 |
358be403
|
Leszek Koltunski
|
|
7 |
|
|
package org.distorted.solvers.cube3;
|
8 |
|
|
|
9 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
10 |
|
|
|
11 |
dfae472b
|
Leszek Koltunski
|
class SolverFaceCube
|
12 |
358be403
|
Leszek Koltunski
|
{
|
13 |
|
|
public int[] f = new int[54];
|
14 |
|
|
|
15 |
|
|
// Map the corner positions to facelet positions. cornerFacelet[URF.ordinal()][0] e.g. gives the position of the
|
16 |
|
|
// facelet in the URF corner position, which defines the orientation.
|
17 |
|
|
// cornerFacelet[URF.ordinal()][1] and cornerFacelet[URF.ordinal()][2] give the position of the other two facelets
|
18 |
|
|
// of the URF corner (clockwise).
|
19 |
|
|
final static int[][] cornerFacelet =
|
20 |
dfae472b
|
Leszek Koltunski
|
{ { SolverFacelet.U9, SolverFacelet.R1, SolverFacelet.F3 }, { SolverFacelet.U7, SolverFacelet.F1, SolverFacelet.L3 },
|
21 |
|
|
{ SolverFacelet.U1, SolverFacelet.L1, SolverFacelet.B3 }, { SolverFacelet.U3, SolverFacelet.B1, SolverFacelet.R3 },
|
22 |
|
|
{ SolverFacelet.D3, SolverFacelet.F9, SolverFacelet.R7 }, { SolverFacelet.D1, SolverFacelet.L9, SolverFacelet.F7 },
|
23 |
|
|
{ SolverFacelet.D7, SolverFacelet.B9, SolverFacelet.L7 }, { SolverFacelet.D9, SolverFacelet.R9, SolverFacelet.B7 } };
|
24 |
358be403
|
Leszek Koltunski
|
|
25 |
|
|
// Map the edge positions to facelet positions. edgeFacelet[UR.ordinal()][0] e.g. gives the position of the facelet in
|
26 |
|
|
// the UR edge position, which defines the orientation.
|
27 |
|
|
// edgeFacelet[UR.ordinal()][1] gives the position of the other facelet
|
28 |
|
|
final static int[][] edgeFacelet =
|
29 |
dfae472b
|
Leszek Koltunski
|
{ { SolverFacelet.U6, SolverFacelet.R2 }, { SolverFacelet.U8, SolverFacelet.F2 }, { SolverFacelet.U4, SolverFacelet.L2 },
|
30 |
|
|
{ SolverFacelet.U2, SolverFacelet.B2 }, { SolverFacelet.D6, SolverFacelet.R8 }, { SolverFacelet.D2, SolverFacelet.F8 },
|
31 |
|
|
{ SolverFacelet.D4, SolverFacelet.L8 }, { SolverFacelet.D8, SolverFacelet.B8 }, { SolverFacelet.F6, SolverFacelet.R4 },
|
32 |
|
|
{ SolverFacelet.F4, SolverFacelet.L6 }, { SolverFacelet.B6, SolverFacelet.L4 }, { SolverFacelet.B4, SolverFacelet.R6 } };
|
33 |
358be403
|
Leszek Koltunski
|
|
34 |
|
|
// Map the corner positions to facelet colors.
|
35 |
|
|
final static int[][] cornerColor =
|
36 |
dfae472b
|
Leszek Koltunski
|
{ { SolverColor.U, SolverColor.R, SolverColor.F }, { SolverColor.U, SolverColor.F, SolverColor.L },
|
37 |
|
|
{ SolverColor.U, SolverColor.L, SolverColor.B }, { SolverColor.U, SolverColor.B, SolverColor.R },
|
38 |
|
|
{ SolverColor.D, SolverColor.F, SolverColor.R }, { SolverColor.D, SolverColor.L, SolverColor.F },
|
39 |
|
|
{ SolverColor.D, SolverColor.B, SolverColor.L }, { SolverColor.D, SolverColor.R, SolverColor.B } };
|
40 |
358be403
|
Leszek Koltunski
|
|
41 |
|
|
// Map the edge positions to facelet colors.
|
42 |
|
|
final static int[][] edgeColor =
|
43 |
dfae472b
|
Leszek Koltunski
|
{ { SolverColor.U, SolverColor.R }, { SolverColor.U, SolverColor.F }, { SolverColor.U, SolverColor.L },
|
44 |
|
|
{ SolverColor.U, SolverColor.B }, { SolverColor.D, SolverColor.R }, { SolverColor.D, SolverColor.F },
|
45 |
|
|
{ SolverColor.D, SolverColor.L }, { SolverColor.D, SolverColor.B }, { SolverColor.F, SolverColor.R },
|
46 |
|
|
{ SolverColor.F, SolverColor.L }, { SolverColor.B, SolverColor.L }, { SolverColor.B, SolverColor.R } };
|
47 |
358be403
|
Leszek Koltunski
|
|
48 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
49 |
|
|
|
50 |
dfae472b
|
Leszek Koltunski
|
SolverFaceCube()
|
51 |
358be403
|
Leszek Koltunski
|
{
|
52 |
|
|
String s = "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB";
|
53 |
|
|
|
54 |
|
|
for( int i=0; i<54; i++)
|
55 |
dfae472b
|
Leszek Koltunski
|
f[i] = SolverColor.toInt(s.substring(i, i + 1));
|
56 |
358be403
|
Leszek Koltunski
|
}
|
57 |
|
|
|
58 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
59 |
|
|
// Construct a facelet cube from a string
|
60 |
|
|
|
61 |
dfae472b
|
Leszek Koltunski
|
SolverFaceCube(String cubeString)
|
62 |
358be403
|
Leszek Koltunski
|
{
|
63 |
|
|
for( int i=0; i<cubeString.length(); i++)
|
64 |
dfae472b
|
Leszek Koltunski
|
f[i] = SolverColor.toInt(cubeString.substring(i, i + 1));
|
65 |
358be403
|
Leszek Koltunski
|
}
|
66 |
|
|
|
67 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
68 |
|
|
// Gives string representation of a facelet cube
|
69 |
|
|
|
70 |
|
|
String to_String()
|
71 |
|
|
{
|
72 |
|
|
String s = "";
|
73 |
|
|
|
74 |
|
|
for (int i = 0; i < 54; i++)
|
75 |
dfae472b
|
Leszek Koltunski
|
s += SolverColor.toString(f[i]);
|
76 |
358be403
|
Leszek Koltunski
|
|
77 |
|
|
return s;
|
78 |
|
|
}
|
79 |
|
|
|
80 |
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
81 |
|
|
// Gives CubieCube representation of a faceletcube
|
82 |
|
|
|
83 |
dfae472b
|
Leszek Koltunski
|
SolverCubieCube toCubieCube()
|
84 |
358be403
|
Leszek Koltunski
|
{
|
85 |
|
|
byte ori;
|
86 |
dfae472b
|
Leszek Koltunski
|
SolverCubieCube ccRet = new SolverCubieCube();
|
87 |
358be403
|
Leszek Koltunski
|
|
88 |
dfae472b
|
Leszek Koltunski
|
for( int i=0; i< 8; i++) ccRet.cp[i] = SolverCorner.URF; // invalidate corners
|
89 |
|
|
for( int i=0; i<12; i++) ccRet.ep[i] = SolverEdge.UR; // and edges
|
90 |
358be403
|
Leszek Koltunski
|
|
91 |
|
|
int col1, col2;
|
92 |
|
|
|
93 |
dfae472b
|
Leszek Koltunski
|
for(int i = SolverCorner.URF; i<= SolverCorner.DRB; i++)
|
94 |
358be403
|
Leszek Koltunski
|
{
|
95 |
|
|
// get the colors of the cubie at corner i, starting with U/D
|
96 |
|
|
for (ori = 0; ori < 3; ori++)
|
97 |
dfae472b
|
Leszek Koltunski
|
if (f[cornerFacelet[i][ori]] == SolverColor.U || f[cornerFacelet[i][ori]] == SolverColor.D)
|
98 |
358be403
|
Leszek Koltunski
|
break;
|
99 |
|
|
|
100 |
|
|
col1 = f[cornerFacelet[i][(ori+1)%3]];
|
101 |
|
|
col2 = f[cornerFacelet[i][(ori+2)%3]];
|
102 |
|
|
|
103 |
dfae472b
|
Leszek Koltunski
|
for(int j = SolverCorner.URF; j<= SolverCorner.DRB; j++)
|
104 |
358be403
|
Leszek Koltunski
|
{
|
105 |
|
|
if( col1==cornerColor[j][1] && col2==cornerColor[j][2])
|
106 |
|
|
{
|
107 |
|
|
// in cornerposition i we have cornercubie j
|
108 |
|
|
ccRet.cp[i] = j;
|
109 |
|
|
ccRet.co[i] = (byte) (ori % 3);
|
110 |
|
|
break;
|
111 |
|
|
}
|
112 |
|
|
}
|
113 |
|
|
}
|
114 |
|
|
|
115 |
dfae472b
|
Leszek Koltunski
|
for(int i = SolverEdge.UR; i<= SolverEdge.BR; i++)
|
116 |
358be403
|
Leszek Koltunski
|
{
|
117 |
dfae472b
|
Leszek Koltunski
|
for(int j = SolverEdge.UR; j<= SolverEdge.BR; j++)
|
118 |
358be403
|
Leszek Koltunski
|
{
|
119 |
|
|
if( f[edgeFacelet[i][0]]==edgeColor[j][0] && f[edgeFacelet[i][1]]==edgeColor[j][1])
|
120 |
|
|
{
|
121 |
|
|
ccRet.ep[i] = j;
|
122 |
|
|
ccRet.eo[i] = 0;
|
123 |
|
|
break;
|
124 |
|
|
}
|
125 |
|
|
if( f[edgeFacelet[i][0]]==edgeColor[j][1] && f[edgeFacelet[i][1]]==edgeColor[j][0])
|
126 |
|
|
{
|
127 |
|
|
ccRet.ep[i] = j;
|
128 |
|
|
ccRet.eo[i] = 1;
|
129 |
|
|
break;
|
130 |
|
|
}
|
131 |
|
|
}
|
132 |
|
|
}
|
133 |
|
|
|
134 |
|
|
return ccRet;
|
135 |
|
|
}
|
136 |
|
|
}
|