Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyCube.java @ 67b2d57b

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 ac940e24 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
132
133 a64e07d0 Leszek Koltunski
  MeshBase createCubitMesh(int cubit, int numLayers)
134 ac940e24 Leszek Koltunski
    {
135
    if( mMeshes==null )
136
      {
137 b1f2ccf5 Leszek Koltunski
      FactoryCubit factory = FactoryCubit.getInstance();
138
      factory.clear();
139 ac940e24 Leszek Koltunski
      mMeshes = new MeshBase[ObjectList.CUBE.getNumVariants()];
140
      }
141
142
    int ordinal= ObjectList.CUBE.ordinal();
143 d99f3a48 Leszek Koltunski
    int index  = ObjectList.getSizeIndex(ordinal,getNumLayers());
144 ac940e24 Leszek Koltunski
145
    if( mMeshes[index]==null )
146
      {
147 b1f2ccf5 Leszek Koltunski
      int extraI, extraV, num;
148 67b2d57b Leszek Koltunski
      float height;
149 b1f2ccf5 Leszek Koltunski
150
      switch(numLayers)
151
        {
152 67b2d57b Leszek Koltunski
        case 2 : num = 6; extraI = 2; extraV = 2; height = 0.045f; break;
153
        case 3 : num = 5; extraI = 2; extraV = 2; height = 0.045f; break;
154
        case 4 : num = 5; extraI = 1; extraV = 1; height = 0.045f; break;
155
        default: num = 5; extraI = 0; extraV = 0; height = 0.045f; break;
156 b1f2ccf5 Leszek Koltunski
        }
157
158 67b2d57b Leszek Koltunski
      float[][] bands     = new float[][] { {height,35,0.5f,0.7f,num,extraI,extraV} };
159 b1f2ccf5 Leszek Koltunski
      int[] bandIndexes   = new int[] { 0,0,0,0,0,0};
160
      float[][] corners   = new float[][] { {0.036f,0.12f} };
161
      int[] cornerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
162 b3c9061a Leszek Koltunski
      float[][] centers   = new float[][] { {0.0f, 0.0f, 0.0f} };
163
      int[] centerIndexes = new int[] { 0,0,0,0,0,0,0,0 };
164 b1f2ccf5 Leszek Koltunski
165
      FactoryCubit factory = FactoryCubit.getInstance();
166
167
      factory.createNewFaceTransform(VERTICES,VERT_INDEXES);
168
      mMeshes[index] = factory.createRoundedSolid(VERTICES, VERT_INDEXES,
169
                                                  bands, bandIndexes,
170
                                                  corners, cornerIndexes,
171 b3c9061a Leszek Koltunski
                                                  centers, centerIndexes,
172 b1f2ccf5 Leszek Koltunski
                                                  getNumCubitFaces() );
173 ac940e24 Leszek Koltunski
      }
174
175
    return mMeshes[index].copy(true);
176
    }
177
178 7289fd6c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
179
180 ae755eda Leszek Koltunski
  void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top)
181 7289fd6c Leszek Koltunski
    {
182 76c2bd07 Leszek Koltunski
    float R = 0.10f;
183 2fcfce81 Leszek Koltunski
    float S = 0.08f;
184 7289fd6c Leszek Koltunski
185 b89898c5 Leszek Koltunski
    FactorySticker factory = FactorySticker.getInstance();
186 b1f2ccf5 Leszek Koltunski
    factory.drawRoundedPolygon(canvas, paint, left, top, STICKERS[0], S, FACE_COLORS[face], R);
187 7289fd6c Leszek Koltunski
    }
188
189 411c6285 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
190
191 b1f2ccf5 Leszek Koltunski
  float[][] getCubitPositions(int numLayers)
192 a10ada2a Leszek Koltunski
    {
193 b1f2ccf5 Leszek Koltunski
    int numCubits = numLayers>1 ? 6*numLayers*numLayers - 12*numLayers + 8 : 1;
194 e6cf7283 Leszek Koltunski
    float[][] tmp = new float[numCubits][];
195 beb325a0 Leszek Koltunski
196 b1f2ccf5 Leszek Koltunski
    float diff = 0.5f*(numLayers-1);
197 a10ada2a Leszek Koltunski
    int currentPosition = 0;
198 beb325a0 Leszek Koltunski
199 b1f2ccf5 Leszek Koltunski
    for(int x = 0; x<numLayers; x++)
200
      for(int y = 0; y<numLayers; y++)
201
        for(int z = 0; z<numLayers; z++)
202
          if( x==0 || x==numLayers-1 || y==0 || y==numLayers-1 || z==0 || z==numLayers-1 )
203 beb325a0 Leszek Koltunski
            {
204 e6cf7283 Leszek Koltunski
            tmp[currentPosition++] = new float[] {x-diff,y-diff,z-diff};
205 a10ada2a Leszek Koltunski
            }
206 47ba5ddc Leszek Koltunski
207 a10ada2a Leszek Koltunski
    return tmp;
208
    }
209 47ba5ddc Leszek Koltunski
210 beb325a0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
211
212 10585385 Leszek Koltunski
  Static4D[] getQuats()
213 a10ada2a Leszek Koltunski
    {
214 10585385 Leszek Koltunski
    return QUATS;
215 a10ada2a Leszek Koltunski
    }
216 47ba5ddc Leszek Koltunski
217 eaee1ddc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
218
219
  boolean shouldResetTextureMaps()
220
    {
221
    return false;
222
    }
223
224 47ba5ddc Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
225
226 411c6285 Leszek Koltunski
  int getNumFaces()
227 a10ada2a Leszek Koltunski
    {
228 411c6285 Leszek Koltunski
    return FACE_COLORS.length;
229 8f53e513 Leszek Koltunski
    }
230
231 7403cdfa Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
232
233 a64e07d0 Leszek Koltunski
  float[] getCuts(int numLayers)
234 7403cdfa Leszek Koltunski
    {
235 a64e07d0 Leszek Koltunski
    float[] cuts = new float[numLayers-1];
236 a97e02b7 Leszek Koltunski
237 a64e07d0 Leszek Koltunski
    for(int i=0; i<numLayers-1; i++)
238 a97e02b7 Leszek Koltunski
      {
239 a64e07d0 Leszek Koltunski
      cuts[i] = (2-numLayers)*0.5f + i;
240 a97e02b7 Leszek Koltunski
      }
241
242
    return cuts;
243 7403cdfa Leszek Koltunski
    }
244
245 eab9d8f8 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
246
247 a64e07d0 Leszek Koltunski
  int getNumStickerTypes(int numLayers)
248 eab9d8f8 Leszek Koltunski
    {
249 b1f2ccf5 Leszek Koltunski
    return STICKERS.length;
250 eab9d8f8 Leszek Koltunski
    }
251
252 8f53e513 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
253
254
  int getNumCubitFaces()
255
    {
256
    return FACE_COLORS.length;
257 411c6285 Leszek Koltunski
    }
258 47ba5ddc Leszek Koltunski
259 f0fa83ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
260
261
  float getScreenRatio()
262
    {
263
    return 0.5f;
264
    }
265
266 f6d06256 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
267
268
  int getFaceColor(int cubit, int cubitface, int size)
269
    {
270 2ef489e2 Leszek Koltunski
    return CUBITS[cubit].mRotationRow[cubitface/2] == (cubitface%2==0 ? (1<<(size-1)):1) ? cubitface : NUM_FACES;
271 f6d06256 Leszek Koltunski
    }
272
273 fb377dae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
274
275
  float returnMultiplier()
276
    {
277 d99f3a48 Leszek Koltunski
    return getNumLayers();
278 fb377dae Leszek Koltunski
    }
279
280 7c969a6d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
281
282 a64e07d0 Leszek Koltunski
  float[] getRowChances(int numLayers)
283 7c969a6d Leszek Koltunski
    {
284 d99f3a48 Leszek Koltunski
    float[] chances = new float[numLayers];
285 7c969a6d Leszek Koltunski
286 d99f3a48 Leszek Koltunski
    for(int i=0; i<numLayers; i++)
287 7c969a6d Leszek Koltunski
      {
288 d99f3a48 Leszek Koltunski
      chances[i] = (i+1.0f) / numLayers;
289 7c969a6d Leszek Koltunski
      }
290
291
    return chances;
292
    }
293
294 e844c116 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
295
// PUBLIC API
296
297 12ad3fca Leszek Koltunski
  public Static3D[] getRotationAxis()
298
    {
299 ad38d800 Leszek Koltunski
    return ROT_AXIS;
300 12ad3fca Leszek Koltunski
    }
301
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303
304 e844c116 Leszek Koltunski
  public int getBasicAngle()
305
    {
306
    return 4;
307
    }
308 39e74052 Leszek Koltunski
309 7c969a6d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
310
311 5043d5d0 Leszek Koltunski
  public void randomizeNewScramble(int[][] scramble, Random rnd, int num)
312 7c969a6d Leszek Koltunski
    {
313 5043d5d0 Leszek Koltunski
    if( num==0 )
314 5cf34c5f Leszek Koltunski
      {
315 5043d5d0 Leszek Koltunski
      scramble[num][0] = rnd.nextInt(ROTATION_AXIS.length);
316 7c969a6d Leszek Koltunski
      }
317
    else
318
      {
319 bbc6471c Leszek Koltunski
      int newVector = rnd.nextInt(ROTATION_AXIS.length-1);
320 5043d5d0 Leszek Koltunski
      scramble[num][0] = (newVector>=scramble[num-1][0] ? newVector+1 : newVector);
321 5cf34c5f Leszek Koltunski
      }
322
323 7c969a6d Leszek Koltunski
    float rowFloat = rnd.nextFloat();
324
325
    for(int row=0; row<mRowChances.length; row++)
326
      {
327 bbc6471c Leszek Koltunski
      if( rowFloat<=mRowChances[row] )
328
        {
329 5043d5d0 Leszek Koltunski
        scramble[num][1] = row;
330 bbc6471c Leszek Koltunski
        break;
331
        }
332 7c969a6d Leszek Koltunski
      }
333
334 5043d5d0 Leszek Koltunski
    switch( rnd.nextInt(4) )
335
      {
336
      case 0: scramble[num][2] = -2; break;
337
      case 1: scramble[num][2] = -1; break;
338
      case 2: scramble[num][2] =  1; break;
339
      case 3: scramble[num][2] =  2; break;
340
      }
341 e46e17fb Leszek Koltunski
    }
342 f0336037 Leszek Koltunski
343 6b6504fe Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
344
345
  public boolean isSolved()
346
    {
347
    int index = CUBITS[0].mQuatIndex;
348
349
    for(int i=1; i<NUM_CUBITS; i++)
350
      {
351 722b2512 Leszek Koltunski
      if( thereIsVisibleDifference(CUBITS[i], index) ) return false;
352 6b6504fe Leszek Koltunski
      }
353
354
    return true;
355
    }
356
357 f0336037 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
358 a304ee64 Leszek Koltunski
// order: Up --> Right --> Front --> Down --> Left --> Back
359
// (because the first implemented Solver - the two-phase Cube3 one - expects such order)
360
//
361 fa0f7a56 Leszek Koltunski
// Solved 3x3x3 Cube maps to "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB"
362 a304ee64 Leszek Koltunski
//
363 fa0f7a56 Leszek Koltunski
// s : size of the cube; let index = a*s + b    (i.e. a,b = row,column)
364
//
365
// Up    :   index --> b<s-1 ? (s-1)*(s+4b)+a : 6*s*s -13*s +8 +a
366 a304ee64 Leszek Koltunski
// Right :   index --> 6*s*s - 12*s + 7 - index
367 fa0f7a56 Leszek Koltunski
// Front :   index --> if b==0  : s*s - 1 - index
368
//                     if b==s-1: 6*s*s -11*s +6 - index
369
//                     else
370
//                         a==0: s*s + s-1 + 4*(b-1)*(s-1) + 2*(s-2) + s
371
//                         else: s*s + s-1 + 4*(b-1)*(s-1) + 2*(s-1-a)
372
// Down  :   index --> b==0 ? (s-1-a) : s*s + s-1 + 4*(b-1)*(s-1) - a
373
// Left  :   index --> (s-1-a)*s + b
374
// Back  :   index --> if b==s-1: s*(s-1-a)
375
//                     if b==0  : 5*s*s -12*s + 8 + (s-1-a)*s
376
//                     else
377
//                        if a==s-1: s*s + 4*(s-2-b)*(s-1)
378
//                        else     : s*s + 4*(s-2-b)*(s-1) + s + (s-2-a)*2
379 f0336037 Leszek Koltunski
380 20931cf6 Leszek Koltunski
  public String retObjectString()
381 f0336037 Leszek Koltunski
    {
382 fa0f7a56 Leszek Koltunski
    StringBuilder objectString = new StringBuilder();
383 d99f3a48 Leszek Koltunski
    int layers = getNumLayers();
384
    int len = layers*layers;
385 ac940e24 Leszek Koltunski
    int cubitIndex, row, col, color,face;
386 fa0f7a56 Leszek Koltunski
387
    final int RIGHT= 0;
388
    final int LEFT = 1;
389
    final int UP   = 2;
390
    final int DOWN = 3;
391
    final int FRONT= 4;
392
    final int BACK = 5;
393
394 fb52fae9 Leszek Koltunski
    // 'I' - interior, theoretically can happen
395
    final char[] FACE_NAMES = { 'R', 'L', 'U', 'D', 'F', 'B', 'I'};
396 49595e4b Leszek Koltunski
397
    face = UP;
398
399 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
400
      {
401 d99f3a48 Leszek Koltunski
      row = i/layers;
402
      col = i%layers;
403 fa0f7a56 Leszek Koltunski
404 d99f3a48 Leszek Koltunski
      cubitIndex = col<layers-1 ? (layers-1)*(layers+4*col) + row : 6*layers*layers - 13*layers + 8 + row;
405 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
406 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
407
      }
408
409 49595e4b Leszek Koltunski
    face = RIGHT;
410
411 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
412
      {
413 d99f3a48 Leszek Koltunski
      cubitIndex = 6*layers*layers - 12*layers +7 - i;
414 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
415 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
416
      }
417
418 064ccc31 Leszek Koltunski
    face = FRONT;
419 49595e4b Leszek Koltunski
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
      if( col==layers-1 ) cubitIndex = 6*layers*layers - 11*layers + 6 -i;
426
      else if(   col==0 ) cubitIndex = layers*layers - 1 - i;
427 fa0f7a56 Leszek Koltunski
      else
428
        {
429 d99f3a48 Leszek Koltunski
        if( row==0 ) cubitIndex = layers*layers + layers-1 + 4*(col-1)*(layers-1) + 2*(layers-2) + layers;
430
        else         cubitIndex = layers*layers + layers-1 + 4*(col-1)*(layers-1) + 2*(layers-1-row);
431 fa0f7a56 Leszek Koltunski
        }
432
433 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
434 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
435
      }
436
437 49595e4b Leszek Koltunski
    face = DOWN;
438
439 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
440
      {
441 d99f3a48 Leszek Koltunski
      row = i/layers;
442
      col = i%layers;
443 fa0f7a56 Leszek Koltunski
444 d99f3a48 Leszek Koltunski
      cubitIndex = col==0 ? layers-1-row : layers*layers + layers-1 + 4*(col-1)*(layers-1) - row;
445 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
446 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
447
      }
448
449 49595e4b Leszek Koltunski
    face = LEFT;
450
451 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
452
      {
453 d99f3a48 Leszek Koltunski
      row = i/layers;
454
      col = i%layers;
455 fa0f7a56 Leszek Koltunski
456 d99f3a48 Leszek Koltunski
      cubitIndex = (layers-1-row)*layers + col;
457 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
458 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
459
      }
460
461 49595e4b Leszek Koltunski
    face = BACK;
462
463 fa0f7a56 Leszek Koltunski
    for(int i=0; i<len; i++)
464
      {
465 d99f3a48 Leszek Koltunski
      row = i/layers;
466
      col = i%layers;
467 fa0f7a56 Leszek Koltunski
468 d99f3a48 Leszek Koltunski
      if( col==layers-1 ) cubitIndex = layers*(layers-1-row);
469
      else if(   col==0 ) cubitIndex = 5*layers*layers - 12*layers + 8 + (layers-1-row)*layers;
470 fa0f7a56 Leszek Koltunski
      else
471
        {
472 d99f3a48 Leszek Koltunski
        if( row==layers-1 ) cubitIndex = layers*layers + 4*(layers-2-col)*(layers-1);
473
        else                cubitIndex = layers*layers + 4*(layers-2-col)*(layers-1) + layers + 2*(layers-2-row);
474 fa0f7a56 Leszek Koltunski
        }
475
476 49595e4b Leszek Koltunski
      color = getCubitFaceColorIndex(cubitIndex,face);
477 fa0f7a56 Leszek Koltunski
      objectString.append(FACE_NAMES[color]);
478
      }
479
480
    return objectString.toString();
481 f0336037 Leszek Koltunski
    }
482 6fd4a72c Leszek Koltunski
483
///////////////////////////////////////////////////////////////////////////////////////////////////
484
485
  public int getObjectName(int numLayers)
486
    {
487
    switch(numLayers)
488
      {
489
      case 2: return R.string.cube2;
490
      case 3: return R.string.cube3;
491
      case 4: return R.string.cube4;
492
      case 5: return R.string.cube5;
493
      }
494
    return R.string.cube3;
495
    }
496
497
///////////////////////////////////////////////////////////////////////////////////////////////////
498
499
  public int getInventor(int numLayers)
500
    {
501
    switch(numLayers)
502
      {
503
      case 2: return R.string.cube2_inventor;
504
      case 3: return R.string.cube3_inventor;
505
      case 4: return R.string.cube4_inventor;
506
      case 5: return R.string.cube5_inventor;
507
      }
508
    return R.string.cube3_inventor;
509
    }
510
511
///////////////////////////////////////////////////////////////////////////////////////////////////
512
513
  public int getComplexity(int numLayers)
514
    {
515
    switch(numLayers)
516
      {
517
      case 2: return 4;
518
      case 3: return 6;
519
      case 4: return 8;
520
      case 5: return 10;
521
      }
522
    return 6;
523
    }
524 0c52af30 Leszek Koltunski
}