1
|
/*
|
2
|
* Herbert Kociemba
|
3
|
*
|
4
|
* BSD-licensed. See https://opensource.org/licenses/BSD-3-Clause
|
5
|
*/
|
6
|
|
7
|
package org.distorted.solvers.cube3;
|
8
|
|
9
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
10
|
|
11
|
class SolverFaceCube
|
12
|
{
|
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
|
{ { 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
|
|
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
|
{ { 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
|
|
34
|
// Map the corner positions to facelet colors.
|
35
|
final static int[][] cornerColor =
|
36
|
{ { 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
|
|
41
|
// Map the edge positions to facelet colors.
|
42
|
final static int[][] edgeColor =
|
43
|
{ { 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
|
|
48
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
49
|
|
50
|
SolverFaceCube()
|
51
|
{
|
52
|
String s = "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB";
|
53
|
|
54
|
for( int i=0; i<54; i++)
|
55
|
f[i] = SolverColor.toInt(s.substring(i, i + 1));
|
56
|
}
|
57
|
|
58
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
59
|
// Construct a facelet cube from a string
|
60
|
|
61
|
SolverFaceCube(String cubeString)
|
62
|
{
|
63
|
for( int i=0; i<cubeString.length(); i++)
|
64
|
f[i] = SolverColor.toInt(cubeString.substring(i, i + 1));
|
65
|
}
|
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
|
s += SolverColor.toString(f[i]);
|
76
|
|
77
|
return s;
|
78
|
}
|
79
|
|
80
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
81
|
// Gives CubieCube representation of a faceletcube
|
82
|
|
83
|
SolverCubieCube toCubieCube()
|
84
|
{
|
85
|
byte ori;
|
86
|
SolverCubieCube ccRet = new SolverCubieCube();
|
87
|
|
88
|
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
|
|
91
|
int col1, col2;
|
92
|
|
93
|
for(int i = SolverCorner.URF; i<= SolverCorner.DRB; i++)
|
94
|
{
|
95
|
// get the colors of the cubie at corner i, starting with U/D
|
96
|
for (ori = 0; ori < 3; ori++)
|
97
|
if (f[cornerFacelet[i][ori]] == SolverColor.U || f[cornerFacelet[i][ori]] == SolverColor.D)
|
98
|
break;
|
99
|
|
100
|
col1 = f[cornerFacelet[i][(ori+1)%3]];
|
101
|
col2 = f[cornerFacelet[i][(ori+2)%3]];
|
102
|
|
103
|
for(int j = SolverCorner.URF; j<= SolverCorner.DRB; j++)
|
104
|
{
|
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
|
for(int i = SolverEdge.UR; i<= SolverEdge.BR; i++)
|
116
|
{
|
117
|
for(int j = SolverEdge.UR; j<= SolverEdge.BR; j++)
|
118
|
{
|
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
|
}
|