Project

General

Profile

Download (5.45 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / kociemba / SolverFaceCube.java @ 6777e712

1
/*
2
 * Herbert Kociemba
3
 *
4
 * BSD-licensed. See https://opensource.org/licenses/BSD-3-Clause
5
 */
6

    
7
package org.distorted.objectlib.kociemba;
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
}
(6-6/8)