Project

General

Profile

Download (17.6 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / objects / TwistyCube.java @ cb137f36

1 0c52af30 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2019 Leszek Koltunski                                                               //
3
//                                                                                               //
4 fdec60a3 Leszek Koltunski
// This file is part of Magic Cube.                                                              //
5 0c52af30 Leszek Koltunski
//                                                                                               //
6 fdec60a3 Leszek Koltunski
// Magic Cube is free software: you can redistribute it and/or modify                            //
7 0c52af30 Leszek Koltunski
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11 fdec60a3 Leszek Koltunski
// Magic Cube is distributed in the hope that it will be useful,                                 //
12 0c52af30 Leszek Koltunski
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17 fdec60a3 Leszek Koltunski
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18 0c52af30 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20 1f9772f3 Leszek Koltunski
package org.distorted.objects;
21 0c52af30 Leszek Koltunski
22 ccf9fec5 Leszek Koltunski
import android.content.res.Resources;
23 0c52af30 Leszek Koltunski
import android.graphics.Canvas;
24
import android.graphics.Paint;
25
26 749ef882 Leszek Koltunski
import org.distorted.helpers.FactoryCubit;
27
import org.distorted.helpers.FactorySticker;
28 0c52af30 Leszek Koltunski
import org.distorted.library.main.DistortedEffects;
29
import org.distorted.library.main.DistortedTexture;
30 b32444ee Leszek Koltunski
import org.distorted.library.mesh.MeshBase;
31 efa8aa48 Leszek Koltunski
import org.distorted.library.mesh.MeshSquare;
32 0c52af30 Leszek Koltunski
import org.distorted.library.type.Static3D;
33
import org.distorted.library.type.Static4D;
34 6fd4a72c Leszek Koltunski
import org.distorted.main.R;
35 0c52af30 Leszek Koltunski
36 7c969a6d Leszek Koltunski
import java.util.Random;
37
38 0c52af30 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
39
40 9c2f0c91 Leszek Koltunski
class TwistyCube extends TwistyObject
41 0c52af30 Leszek Koltunski
{
42 e844c116 Leszek Koltunski
  // the three rotation axis of a RubikCube. Must be normalized.
43 ad38d800 Leszek Koltunski
  static final Static3D[] ROT_AXIS = new Static3D[]
44 efef689c Leszek Koltunski
         {
45
           new Static3D(1,0,0),
46
           new Static3D(0,1,0),
47
           new Static3D(0,0,1)
48
         };
49
50 37a25788 Leszek Koltunski
  private static final int[] FACE_COLORS = new int[]
51 efef689c Leszek Koltunski
         {
52 ece1b58d Leszek Koltunski
           COLOR_YELLOW, COLOR_WHITE,
53
           COLOR_BLUE  , COLOR_GREEN,
54 323b217c Leszek Koltunski
           COLOR_RED   , COLOR_ORANGE
55 efef689c Leszek Koltunski
         };
56
57 10585385 Leszek Koltunski
  // All legal rotation quats of a RubikCube of any size.
58 efef689c Leszek Koltunski
  // Here's how to compute this:
59
  // 1) compute how many rotations there are (RubikCube of any size = 24)
60
  // 2) take the AXIS, angles of rotation (90 in RubikCube's case) compute the basic quaternions
61
  // (i.e. rotations of 1 basic angle along each of the axis) and from there start semi-randomly
62
  // multiplying them and eventually you'll find all (24) legal rotations.
63 9f4c44fe Leszek Koltunski
  // Example program in C, res/raw/compute_quats.c , is included.
64 10585385 Leszek Koltunski
  private static final Static4D[] QUATS = new Static4D[]
65 efef689c Leszek Koltunski
         {
66 10585385 Leszek Koltunski
         new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),
67
         new Static4D(  1.0f,   0.0f,   0.0f,   0.0f),
68
         new Static4D(  0.0f,   1.0f,   0.0f,   0.0f),
69
         new Static4D(  0.0f,   0.0f,   1.0f,   0.0f),
70
71
         new Static4D( SQ2/2,  SQ2/2,  0.0f ,   0.0f),
72
         new Static4D( SQ2/2, -SQ2/2,  0.0f ,   0.0f),
73
         new Static4D( SQ2/2,   0.0f,  SQ2/2,   0.0f),
74
         new Static4D(-SQ2/2,   0.0f,  SQ2/2,   0.0f),
75
         new Static4D( SQ2/2,   0.0f,   0.0f,  SQ2/2),
76
         new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),
77
         new Static4D(  0.0f,  SQ2/2,  SQ2/2,   0.0f),
78
         new Static4D(  0.0f,  SQ2/2, -SQ2/2,   0.0f),
79
         new Static4D(  0.0f,  SQ2/2,   0.0f,  SQ2/2),
80
         new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),
81
         new Static4D(  0.0f,   0.0f,  SQ2/2,  SQ2/2),
82
         new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),
83
84
         new Static4D(  0.5f,   0.5f,   0.5f,   0.5f),
85
         new Static4D(  0.5f,   0.5f,  -0.5f,   0.5f),
86
         new Static4D(  0.5f,   0.5f,  -0.5f,  -0.5f),
87
         new Static4D(  0.5f,  -0.5f,   0.5f,  -0.5f),
88
         new Static4D( -0.5f,  -0.5f,  -0.5f,   0.5f),
89
         new Static4D( -0.5f,   0.5f,  -0.5f,  -0.5f),
90
         new Static4D( -0.5f,   0.5f,   0.5f,  -0.5f),
91
         new Static4D( -0.5f,   0.5f,   0.5f,   0.5f)
92 efef689c Leszek Koltunski
         };
93 411c6285 Leszek Koltunski
94 b1f2ccf5 Leszek Koltunski
  private static final double[][] VERTICES = new double[][]
95
          {
96
              { 0.5, 0.5, 0.5 },
97
              { 0.5, 0.5,-0.5 },
98
              { 0.5,-0.5, 0.5 },
99
              { 0.5,-0.5,-0.5 },
100
              {-0.5, 0.5, 0.5 },
101
              {-0.5, 0.5,-0.5 },
102
              {-0.5,-0.5, 0.5 },
103
              {-0.5,-0.5,-0.5 },
104
          };
105
106
  private static final int[][] VERT_INDEXES = new int[][]
107
          {
108
              {2,3,1,0},   // counterclockwise!
109
              {7,6,4,5},
110
              {4,0,1,5},
111
              {7,3,2,6},
112
              {6,2,0,4},
113
              {3,7,5,1}
114
          };
115
116
  private static final float[][] STICKERS = new float[][]
117
          {
118
              { -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f }
119
          };
120
121 fbca0033 Leszek Koltunski
  private static MeshBase[] mMeshes;
122 40ab026e Leszek Koltunski
123 411c6285 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
124
125 9c2f0c91 Leszek Koltunski
  TwistyCube(int size, Static4D quat, DistortedTexture texture,
126
             MeshSquare mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
127 411c6285 Leszek Koltunski
    {
128 db875721 Leszek Koltunski
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.CUBE, res, scrWidth);
129 411c6285 Leszek Koltunski
    }
130
131 b1f2ccf5 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
132
133
  double[][] getVertices(int cubitType)
134
    {
135
    return VERTICES;
136
    }
137
138
///////////////////////////////////////////////////////////////////////////////////////////////////
139
140
  int[][] getVertIndexes(int cubitType)
141
    {
142
    return VERT_INDEXES;
143
    }
144
145
///////////////////////////////////////////////////////////////////////////////////////////////////
146
// in the sense of shape, there's always only 1 cubit type.
147
148
  int getNumCubitTypes(int numLayers)
149
    {
150
    return 1;
151
    }
152
153 ac940e24 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
154
155 a64e07d0 Leszek Koltunski
  MeshBase createCubitMesh(int cubit, int numLayers)
156 ac940e24 Leszek Koltunski
    {
157
    if( mMeshes==null )
158
      {
159 b1f2ccf5 Leszek Koltunski
      FactoryCubit factory = FactoryCubit.getInstance();
160
      factory.clear();
161 ac940e24 Leszek Koltunski
      mMeshes = new MeshBase[ObjectList.CUBE.getNumVariants()];
162
      }
163
164
    int ordinal= ObjectList.CUBE.ordinal();
165 d99f3a48 Leszek Koltunski
    int index  = ObjectList.getSizeIndex(ordinal,getNumLayers());
166 ac940e24 Leszek Koltunski
167
    if( mMeshes[index]==null )
168
      {
169 b1f2ccf5 Leszek Koltunski
      int extraI, extraV, num;
170
171
      switch(numLayers)
172
        {
173
        case 2 : num = 6; extraI = 2; extraV = 2; break;
174
        case 3 : num = 5; extraI = 2; extraV = 2; break;
175
        case 4 : num = 5; extraI = 1; extraV = 2; break;
176
        default: num = 5; extraI = 1; extraV = 0; break;
177
        }
178
179
      float[][] bands     = new float[][] { {0.038f,35,0.5f,0.7f,num,extraI,extraV} };
180
      int[] bandIndexes   = new int[] { 0,0,0,0,0,0};
181
      float[][] corners   = new float[][] { {0.036f,0.12f} };
182
      int[] cornerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
183 b3c9061a Leszek Koltunski
      float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
184
      int[] centerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
185 b1f2ccf5 Leszek Koltunski
186
      FactoryCubit factory = FactoryCubit.getInstance();
187
188
      factory.createNewFaceTransform(VERTICES,VERT_INDEXES);
189
      mMeshes[index] = factory.createRoundedSolid(VERTICES, VERT_INDEXES,
190
                                                  bands, bandIndexes,
191
                                                  corners, cornerIndexes,
192 b3c9061a Leszek Koltunski
                                                  centers, centerIndexes,
193 b1f2ccf5 Leszek Koltunski
                                                  getNumCubitFaces() );
194 ac940e24 Leszek Koltunski
      }
195
196
    return mMeshes[index].copy(true);
197
    }
198
199 7289fd6c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
200
201 ae755eda Leszek Koltunski
  void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top)
202 7289fd6c Leszek Koltunski
    {
203 76c2bd07 Leszek Koltunski
    float R = 0.10f;
204 2fcfce81 Leszek Koltunski
    float S = 0.08f;
205 7289fd6c Leszek Koltunski
206 b89898c5 Leszek Koltunski
    FactorySticker factory = FactorySticker.getInstance();
207 b1f2ccf5 Leszek Koltunski
    factory.drawRoundedPolygon(canvas, paint, left, top, STICKERS[0], S, FACE_COLORS[face], R);
208 7289fd6c Leszek Koltunski
    }
209
210 411c6285 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
211
212 b1f2ccf5 Leszek Koltunski
  float[][] getCubitPositions(int numLayers)
213 a10ada2a Leszek Koltunski
    {
214 b1f2ccf5 Leszek Koltunski
    int numCubits = numLayers>1 ? 6*numLayers*numLayers - 12*numLayers + 8 : 1;
215 e6cf7283 Leszek Koltunski
    float[][] tmp = new float[numCubits][];
216 beb325a0 Leszek Koltunski
217 b1f2ccf5 Leszek Koltunski
    float diff = 0.5f*(numLayers-1);
218 a10ada2a Leszek Koltunski
    int currentPosition = 0;
219 beb325a0 Leszek Koltunski
220 b1f2ccf5 Leszek Koltunski
    for(int x = 0; x<numLayers; x++)
221
      for(int y = 0; y<numLayers; y++)
222
        for(int z = 0; z<numLayers; z++)
223
          if( x==0 || x==numLayers-1 || y==0 || y==numLayers-1 || z==0 || z==numLayers-1 )
224 beb325a0 Leszek Koltunski
            {
225 e6cf7283 Leszek Koltunski
            tmp[currentPosition++] = new float[] {x-diff,y-diff,z-diff};
226 a10ada2a Leszek Koltunski
            }
227 47ba5ddc Leszek Koltunski
228 a10ada2a Leszek Koltunski
    return tmp;
229
    }
230 47ba5ddc Leszek Koltunski
231 beb325a0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
232
233 10585385 Leszek Koltunski
  Static4D[] getQuats()
234 a10ada2a Leszek Koltunski
    {
235 10585385 Leszek Koltunski
    return QUATS;
236 a10ada2a Leszek Koltunski
    }
237 47ba5ddc Leszek Koltunski
238 eaee1ddc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
239
240
  boolean shouldResetTextureMaps()
241
    {
242
    return false;
243
    }
244
245 47ba5ddc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
246
247 411c6285 Leszek Koltunski
  int getNumFaces()
248 a10ada2a Leszek Koltunski
    {
249 411c6285 Leszek Koltunski
    return FACE_COLORS.length;
250 8f53e513 Leszek Koltunski
    }
251
252 7403cdfa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
253
254 a64e07d0 Leszek Koltunski
  float[] getCuts(int numLayers)
255 7403cdfa Leszek Koltunski
    {
256 a64e07d0 Leszek Koltunski
    float[] cuts = new float[numLayers-1];
257 a97e02b7 Leszek Koltunski
258 a64e07d0 Leszek Koltunski
    for(int i=0; i<numLayers-1; i++)
259 a97e02b7 Leszek Koltunski
      {
260 a64e07d0 Leszek Koltunski
      cuts[i] = (2-numLayers)*0.5f + i;
261 a97e02b7 Leszek Koltunski
      }
262
263
    return cuts;
264 7403cdfa Leszek Koltunski
    }
265
266 eab9d8f8 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
267
268 a64e07d0 Leszek Koltunski
  int getNumStickerTypes(int numLayers)
269 eab9d8f8 Leszek Koltunski
    {
270 b1f2ccf5 Leszek Koltunski
    return STICKERS.length;
271 eab9d8f8 Leszek Koltunski
    }
272
273 8f53e513 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
274
275
  int getNumCubitFaces()
276
    {
277
    return FACE_COLORS.length;
278 411c6285 Leszek Koltunski
    }
279 47ba5ddc Leszek Koltunski
280 f0fa83ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
281
282
  float getScreenRatio()
283
    {
284
    return 0.5f;
285
    }
286
287 f6d06256 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
288
289
  int getFaceColor(int cubit, int cubitface, int size)
290
    {
291 2ef489e2 Leszek Koltunski
    return CUBITS[cubit].mRotationRow[cubitface/2] == (cubitface%2==0 ? (1<<(size-1)):1) ? cubitface : NUM_FACES;
292 f6d06256 Leszek Koltunski
    }
293
294 fb377dae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
295
296
  float returnMultiplier()
297
    {
298 d99f3a48 Leszek Koltunski
    return getNumLayers();
299 fb377dae Leszek Koltunski
    }
300
301 7c969a6d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
302
303 a64e07d0 Leszek Koltunski
  float[] getRowChances(int numLayers)
304 7c969a6d Leszek Koltunski
    {
305 d99f3a48 Leszek Koltunski
    float[] chances = new float[numLayers];
306 7c969a6d Leszek Koltunski
307 d99f3a48 Leszek Koltunski
    for(int i=0; i<numLayers; i++)
308 7c969a6d Leszek Koltunski
      {
309 d99f3a48 Leszek Koltunski
      chances[i] = (i+1.0f) / numLayers;
310 7c969a6d Leszek Koltunski
      }
311
312
    return chances;
313
    }
314
315 e844c116 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
316
// PUBLIC API
317
318 12ad3fca Leszek Koltunski
  public Static3D[] getRotationAxis()
319
    {
320 ad38d800 Leszek Koltunski
    return ROT_AXIS;
321 12ad3fca Leszek Koltunski
    }
322
323
///////////////////////////////////////////////////////////////////////////////////////////////////
324
325 e844c116 Leszek Koltunski
  public int getBasicAngle()
326
    {
327
    return 4;
328
    }
329 39e74052 Leszek Koltunski
330 7c969a6d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
331
332 5043d5d0 Leszek Koltunski
  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
333 7c969a6d Leszek Koltunski
    {
334 5043d5d0 Leszek Koltunski
    if( num==0 )
335 5cf34c5f Leszek Koltunski
      {
336 5043d5d0 Leszek Koltunski
      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
337 7c969a6d Leszek Koltunski
      }
338
    else
339
      {
340 bbc6471c Leszek Koltunski
      int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
341 5043d5d0 Leszek Koltunski
      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
342 5cf34c5f Leszek Koltunski
      }
343
344 7c969a6d Leszek Koltunski
    float rowFloat = rnd.nextFloat();
345
346
    for(int row=0; row<mRowChances.length; row++)
347
      {
348 bbc6471c Leszek Koltunski
      if( rowFloat<=mRowChances[row] )
349
        {
350 5043d5d0 Leszek Koltunski
        scramble[num][1] = row;
351 bbc6471c Leszek Koltunski
        break;
352
        }
353 7c969a6d Leszek Koltunski
      }
354
355 5043d5d0 Leszek Koltunski
    switch( rnd.nextInt(4) )
356
      {
357
      case 0: scramble[num][2] = -2; break;
358
      case 1: scramble[num][2] = -1; break;
359
      case 2: scramble[num][2] =  1; break;
360
      case 3: scramble[num][2] =  2; break;
361
      }
362 e46e17fb Leszek Koltunski
    }
363 f0336037 Leszek Koltunski
364 6b6504fe Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
365
366
  public boolean isSolved()
367
    {
368
    int index = CUBITS[0].mQuatIndex;
369
370
    for(int i=1; i<NUM_CUBITS; i++)
371
      {
372 722b2512 Leszek Koltunski
      if( thereIsVisibleDifference(CUBITS[i], index) ) return false;
373 6b6504fe Leszek Koltunski
      }
374
375
    return true;
376
    }
377
378 f0336037 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
379 a304ee64 Leszek Koltunski
// order: Up --> Right --> Front --> Down --> Left --> Back
380
// (because the first implemented Solver - the two-phase Cube3 one - expects such order)
381
//
382 fa0f7a56 Leszek Koltunski
// Solved 3x3x3 Cube maps to "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB"
383 a304ee64 Leszek Koltunski
//
384 fa0f7a56 Leszek Koltunski
// s : size of the cube; let index = a*s + b    (i.e. a,b = row,column)
385
//
386
// Up    :   index --> b<s-1 ? (s-1)*(s+4b)+a : 6*s*s -13*s +8 +a
387 a304ee64 Leszek Koltunski
// Right :   index --> 6*s*s - 12*s + 7 - index
388 fa0f7a56 Leszek Koltunski
// Front :   index --> if b==0  : s*s - 1 - index
389
//                     if b==s-1: 6*s*s -11*s +6 - index
390
//                     else
391
//                         a==0: s*s + s-1 + 4*(b-1)*(s-1) + 2*(s-2) + s
392
//                         else: s*s + s-1 + 4*(b-1)*(s-1) + 2*(s-1-a)
393
// Down  :   index --> b==0 ? (s-1-a) : s*s + s-1 + 4*(b-1)*(s-1) - a
394
// Left  :   index --> (s-1-a)*s + b
395
// Back  :   index --> if b==s-1: s*(s-1-a)
396
//                     if b==0  : 5*s*s -12*s + 8 + (s-1-a)*s
397
//                     else
398
//                        if a==s-1: s*s + 4*(s-2-b)*(s-1)
399
//                        else     : s*s + 4*(s-2-b)*(s-1) + s + (s-2-a)*2
400 f0336037 Leszek Koltunski
401 20931cf6 Leszek Koltunski
  public String retObjectString()
402 f0336037 Leszek Koltunski
    {
403 fa0f7a56 Leszek Koltunski
    StringBuilder objectString = new StringBuilder();
404 d99f3a48 Leszek Koltunski
    int layers = getNumLayers();
405
    int len = layers*layers;
406 ac940e24 Leszek Koltunski
    int cubitIndex, row, col, color,face;
407 fa0f7a56 Leszek Koltunski
408
    final int RIGHT= 0;
409
    final int LEFT = 1;
410
    final int UP   = 2;
411
    final int DOWN = 3;
412
    final int FRONT= 4;
413
    final int BACK = 5;
414
415 fb52fae9 Leszek Koltunski
    // 'I' - interior, theoretically can happen
416
    final char[] FACE_NAMES = { 'R', 'L', 'U', 'D', 'F', 'B', 'I'};
417 49595e4b Leszek Koltunski
418
    face = UP;
419
420 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
421
      {
422 d99f3a48 Leszek Koltunski
      row = i/layers;
423
      col = i%layers;
424 fa0f7a56 Leszek Koltunski
425 d99f3a48 Leszek Koltunski
      cubitIndex = col<layers-1 ? (layers-1)*(layers+4*col) + row : 6*layers*layers - 13*layers + 8 + row;
426 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
427 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
428
      }
429
430 49595e4b Leszek Koltunski
    face = RIGHT;
431
432 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
433
      {
434 d99f3a48 Leszek Koltunski
      cubitIndex = 6*layers*layers - 12*layers +7 - i;
435 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
436 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
437
      }
438
439 064ccc31 Leszek Koltunski
    face = FRONT;
440 49595e4b Leszek Koltunski
441 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
442
      {
443 d99f3a48 Leszek Koltunski
      row = i/layers;
444
      col = i%layers;
445 fa0f7a56 Leszek Koltunski
446 d99f3a48 Leszek Koltunski
      if( col==layers-1 ) cubitIndex = 6*layers*layers - 11*layers + 6 -i;
447
      else if(   col==0 ) cubitIndex = layers*layers - 1 - i;
448 fa0f7a56 Leszek Koltunski
      else
449
        {
450 d99f3a48 Leszek Koltunski
        if( row==0 ) cubitIndex = layers*layers + layers-1 + 4*(col-1)*(layers-1) + 2*(layers-2) + layers;
451
        else         cubitIndex = layers*layers + layers-1 + 4*(col-1)*(layers-1) + 2*(layers-1-row);
452 fa0f7a56 Leszek Koltunski
        }
453
454 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
455 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
456
      }
457
458 49595e4b Leszek Koltunski
    face = DOWN;
459
460 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
461
      {
462 d99f3a48 Leszek Koltunski
      row = i/layers;
463
      col = i%layers;
464 fa0f7a56 Leszek Koltunski
465 d99f3a48 Leszek Koltunski
      cubitIndex = col==0 ? layers-1-row : layers*layers + layers-1 + 4*(col-1)*(layers-1) - row;
466 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
467 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
468
      }
469
470 49595e4b Leszek Koltunski
    face = LEFT;
471
472 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
473
      {
474 d99f3a48 Leszek Koltunski
      row = i/layers;
475
      col = i%layers;
476 fa0f7a56 Leszek Koltunski
477 d99f3a48 Leszek Koltunski
      cubitIndex = (layers-1-row)*layers + col;
478 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
479 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
480
      }
481
482 49595e4b Leszek Koltunski
    face = BACK;
483
484 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
485
      {
486 d99f3a48 Leszek Koltunski
      row = i/layers;
487
      col = i%layers;
488 fa0f7a56 Leszek Koltunski
489 d99f3a48 Leszek Koltunski
      if( col==layers-1 ) cubitIndex = layers*(layers-1-row);
490
      else if(   col==0 ) cubitIndex = 5*layers*layers - 12*layers + 8 + (layers-1-row)*layers;
491 fa0f7a56 Leszek Koltunski
      else
492
        {
493 d99f3a48 Leszek Koltunski
        if( row==layers-1 ) cubitIndex = layers*layers + 4*(layers-2-col)*(layers-1);
494
        else                cubitIndex = layers*layers + 4*(layers-2-col)*(layers-1) + layers + 2*(layers-2-row);
495 fa0f7a56 Leszek Koltunski
        }
496
497 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
498 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
499
      }
500
501
    return objectString.toString();
502 f0336037 Leszek Koltunski
    }
503 6fd4a72c Leszek Koltunski
504
///////////////////////////////////////////////////////////////////////////////////////////////////
505
506
  public int getObjectName(int numLayers)
507
    {
508
    switch(numLayers)
509
      {
510
      case 2: return R.string.cube2;
511
      case 3: return R.string.cube3;
512
      case 4: return R.string.cube4;
513
      case 5: return R.string.cube5;
514
      }
515
    return R.string.cube3;
516
    }
517
518
///////////////////////////////////////////////////////////////////////////////////////////////////
519
520
  public int getInventor(int numLayers)
521
    {
522
    switch(numLayers)
523
      {
524
      case 2: return R.string.cube2_inventor;
525
      case 3: return R.string.cube3_inventor;
526
      case 4: return R.string.cube4_inventor;
527
      case 5: return R.string.cube5_inventor;
528
      }
529
    return R.string.cube3_inventor;
530
    }
531
532
///////////////////////////////////////////////////////////////////////////////////////////////////
533
534
  public int getComplexity(int numLayers)
535
    {
536
    switch(numLayers)
537
      {
538
      case 2: return 4;
539
      case 3: return 6;
540
      case 4: return 8;
541
      case 5: return 10;
542
      }
543
    return 6;
544
    }
545 0c52af30 Leszek Koltunski
}