Project

General

Profile

« Previous | Next » 

Revision ecf3f149

Added by Leszek Koltunski almost 3 years ago

Move the TwistyObject.retCubePosition() to the solver.

View differences:

src/main/java/org/distorted/solvers/SolverMain.java
23 23

  
24 24
import org.distorted.main.R;
25 25
import org.distorted.objects.ObjectList;
26
import org.distorted.objects.TwistyObject;
26 27
import org.distorted.screens.ScreenList;
27 28
import org.distorted.screens.RubikScreenSolver;
28 29

  
......
30 31

  
31 32
public class SolverMain implements Runnable
32 33
{
33
  private final String mObjectPosition;
34 34
  private final Resources mRes;
35
  private final ObjectList mObject;
36
  private final int mSize;
35
  private final TwistyObject mObject;
37 36

  
38 37
///////////////////////////////////////////////////////////////////////////////////////////////////
39 38

  
40
  public SolverMain(Resources res, ObjectList object, int size, String position )
39
  public SolverMain(Resources res, TwistyObject object)
41 40
    {
42
    mRes            = res;
43
    mObject         = object;
44
    mSize           = size;
45
    mObjectPosition = position;
41
    mRes   = res;
42
    mObject= object;
46 43
    }
47 44

  
48 45
///////////////////////////////////////////////////////////////////////////////////////////////////
......
75 72
    if( !org.distorted.solvers.cube3.Search.prepare(mRes) )
76 73
      result= "Error 9";
77 74
    else
78
      result = org.distorted.solvers.cube3.Search.solution(mObjectPosition, 24, 20);
75
      {
76
      String objectPosition = prepareCube3position();
77
      result = org.distorted.solvers.cube3.Search.solution(objectPosition, 24, 20);
78
      }
79 79

  
80 80
    if (result.contains("Error"))
81 81
      {
......
100 100
      }
101 101
    }
102 102

  
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104
// order: Up --> Right --> Front --> Down --> Left --> Back
105
// (because the first implemented Solver - the two-phase Cube3 one - expects such order)
106
//
107
// Solved 3x3x3 Cube maps to "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB"
108
//
109
// s : size of the cube; let index = a*s + b    (i.e. a,b = row,column)
110
//
111
// Up    :   index --> b<s-1 ? (s-1)*(s+4b)+a : 6*s*s -13*s +8 +a
112
// Right :   index --> 6*s*s - 12*s + 7 - index
113
// Front :   index --> if b==0  : s*s - 1 - index
114
//                     if b==s-1: 6*s*s -11*s +6 - index
115
//                     else
116
//                         a==0: s*s + s-1 + 4*(b-1)*(s-1) + 2*(s-2) + s
117
//                         else: s*s + s-1 + 4*(b-1)*(s-1) + 2*(s-1-a)
118
// Down  :   index --> b==0 ? (s-1-a) : s*s + s-1 + 4*(b-1)*(s-1) - a
119
// Left  :   index --> (s-1-a)*s + b
120
// Back  :   index --> if b==s-1: s*(s-1-a)
121
//                     if b==0  : 5*s*s -12*s + 8 + (s-1-a)*s
122
//                     else
123
//                        if a==s-1: s*s + 4*(s-2-b)*(s-1)
124
//                        else     : s*s + 4*(s-2-b)*(s-1) + s + (s-2-a)*2
125

  
126
  private String prepareCube3position()
127
    {
128
    StringBuilder objectString = new StringBuilder();
129
    int layers = mObject.getNumLayers();
130
    int len = layers*layers;
131
    int cubitIndex, row, col, color,face;
132

  
133
    final int RIGHT= 0;
134
    final int LEFT = 1;
135
    final int UP   = 2;
136
    final int DOWN = 3;
137
    final int FRONT= 4;
138
    final int BACK = 5;
139

  
140
    // 'I' - interior, theoretically can happen
141
    final char[] FACE_NAMES = { 'R', 'L', 'U', 'D', 'F', 'B', 'I'};
142

  
143
    face = UP;
144

  
145
    for(int i=0; i<len; i++)
146
      {
147
      row = i/layers;
148
      col = i%layers;
149

  
150
      cubitIndex = col<layers-1 ? (layers-1)*(layers+4*col) + row : 6*layers*layers - 13*layers + 8 + row;
151
      color = mObject.getCubitFaceColorIndex(cubitIndex,face);
152
      objectString.append(FACE_NAMES[color]);
153
      }
154

  
155
    face = RIGHT;
156

  
157
    for(int i=0; i<len; i++)
158
      {
159
      cubitIndex = 6*layers*layers - 12*layers +7 - i;
160
      color = mObject.getCubitFaceColorIndex(cubitIndex,face);
161
      objectString.append(FACE_NAMES[color]);
162
      }
163

  
164
    face = FRONT;
165

  
166
    for(int i=0; i<len; i++)
167
      {
168
      row = i/layers;
169
      col = i%layers;
170

  
171
      if( col==layers-1 ) cubitIndex = 6*layers*layers - 11*layers + 6 -i;
172
      else if(   col==0 ) cubitIndex = layers*layers - 1 - i;
173
      else
174
        {
175
        if( row==0 ) cubitIndex = layers*layers + layers-1 + 4*(col-1)*(layers-1) + 2*(layers-2) + layers;
176
        else         cubitIndex = layers*layers + layers-1 + 4*(col-1)*(layers-1) + 2*(layers-1-row);
177
        }
178

  
179
      color = mObject.getCubitFaceColorIndex(cubitIndex,face);
180
      objectString.append(FACE_NAMES[color]);
181
      }
182

  
183
    face = DOWN;
184

  
185
    for(int i=0; i<len; i++)
186
      {
187
      row = i/layers;
188
      col = i%layers;
189

  
190
      cubitIndex = col==0 ? layers-1-row : layers*layers + layers-1 + 4*(col-1)*(layers-1) - row;
191
      color = mObject.getCubitFaceColorIndex(cubitIndex,face);
192
      objectString.append(FACE_NAMES[color]);
193
      }
194

  
195
    face = LEFT;
196

  
197
    for(int i=0; i<len; i++)
198
      {
199
      row = i/layers;
200
      col = i%layers;
201

  
202
      cubitIndex = (layers-1-row)*layers + col;
203
      color = mObject.getCubitFaceColorIndex(cubitIndex,face);
204
      objectString.append(FACE_NAMES[color]);
205
      }
206

  
207
    face = BACK;
208

  
209
    for(int i=0; i<len; i++)
210
      {
211
      row = i/layers;
212
      col = i%layers;
213

  
214
      if( col==layers-1 ) cubitIndex = layers*(layers-1-row);
215
      else if(   col==0 ) cubitIndex = 5*layers*layers - 12*layers + 8 + (layers-1-row)*layers;
216
      else
217
        {
218
        if( row==layers-1 ) cubitIndex = layers*layers + 4*(layers-2-col)*(layers-1);
219
        else                cubitIndex = layers*layers + 4*(layers-2-col)*(layers-1) + layers + 2*(layers-2-row);
220
        }
221

  
222
      color = mObject.getCubitFaceColorIndex(cubitIndex,face);
223
      objectString.append(FACE_NAMES[color]);
224
      }
225

  
226
    return objectString.toString();
227
    }
228

  
103 229
///////////////////////////////////////////////////////////////////////////////////////////////////
104 230

  
105 231
  private void interruptCube3()
......
121 247
    {
122 248
    RubikScreenSolver solver = (RubikScreenSolver) ScreenList.SVER.getScreenClass();
123 249

  
124
    if( mObject == ObjectList.CUBE && mSize == 3)
250
    if( mObject.getObjectList()==ObjectList.CUBE && mObject.getNumLayers()==3 )
125 251
      {
126 252
      solveCube3(solver);
127 253
      }

Also available in: Unified diff