Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / RubikCube.java @ f6d06256

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 14bd7976 Leszek Koltunski
import org.distorted.library.effect.VertexEffectDeform;
27 40ab026e Leszek Koltunski
import org.distorted.library.effect.VertexEffectMove;
28
import org.distorted.library.effect.VertexEffectRotate;
29 f0fa83ae Leszek Koltunski
import org.distorted.library.effect.VertexEffectSink;
30 0c52af30 Leszek Koltunski
import org.distorted.library.main.DistortedEffects;
31
import org.distorted.library.main.DistortedTexture;
32 b32444ee Leszek Koltunski
import org.distorted.library.mesh.MeshBase;
33 411c6285 Leszek Koltunski
import org.distorted.library.mesh.MeshJoined;
34 97c012ae Leszek Koltunski
import org.distorted.library.mesh.MeshRectangles;
35 411c6285 Leszek Koltunski
import org.distorted.library.type.Static1D;
36 0c52af30 Leszek Koltunski
import org.distorted.library.type.Static3D;
37
import org.distorted.library.type.Static4D;
38
39
///////////////////////////////////////////////////////////////////////////////////////////////////
40
41 27a70eae Leszek Koltunski
class RubikCube extends RubikObject
42 0c52af30 Leszek Koltunski
{
43 10585385 Leszek Koltunski
  static final float SQ2 = (float)Math.sqrt(2);
44
45 e844c116 Leszek Koltunski
  // the three rotation axis of a RubikCube. Must be normalized.
46 9cd7695f Leszek Koltunski
  static final Static3D[] AXIS = new Static3D[]
47 efef689c Leszek Koltunski
         {
48
           new Static3D(1,0,0),
49
           new Static3D(0,1,0),
50
           new Static3D(0,0,1)
51
         };
52
53 37a25788 Leszek Koltunski
  private static final int[] FACE_COLORS = new int[]
54 efef689c Leszek Koltunski
         {
55
           0xffffff00, 0xffffffff,   // AXIS[0]right (right-YELLOW) AXIS[0]left (left  -WHITE)
56
           0xff0000ff, 0xff00ff00,   // AXIS[1]right (top  -BLUE  ) AXIS[1]left (bottom-GREEN)
57
           0xffff0000, 0xffb5651d    // AXIS[2]right (front-RED   ) AXIS[2]left (back  -BROWN)
58
         };
59
60 10585385 Leszek Koltunski
  // All legal rotation quats of a RubikCube of any size.
61 efef689c Leszek Koltunski
  // Here's how to compute this:
62
  // 1) compute how many rotations there are (RubikCube of any size = 24)
63
  // 2) take the AXIS, angles of rotation (90 in RubikCube's case) compute the basic quaternions
64
  // (i.e. rotations of 1 basic angle along each of the axis) and from there start semi-randomly
65
  // multiplying them and eventually you'll find all (24) legal rotations.
66 9f4c44fe Leszek Koltunski
  // Example program in C, res/raw/compute_quats.c , is included.
67 10585385 Leszek Koltunski
  private static final Static4D[] QUATS = new Static4D[]
68 efef689c Leszek Koltunski
         {
69 10585385 Leszek Koltunski
         new Static4D(  0.0f,   0.0f,   0.0f,   1.0f),
70
         new Static4D(  1.0f,   0.0f,   0.0f,   0.0f),
71
         new Static4D(  0.0f,   1.0f,   0.0f,   0.0f),
72
         new Static4D(  0.0f,   0.0f,   1.0f,   0.0f),
73
74
         new Static4D( SQ2/2,  SQ2/2,  0.0f ,   0.0f),
75
         new Static4D( SQ2/2, -SQ2/2,  0.0f ,   0.0f),
76
         new Static4D( SQ2/2,   0.0f,  SQ2/2,   0.0f),
77
         new Static4D(-SQ2/2,   0.0f,  SQ2/2,   0.0f),
78
         new Static4D( SQ2/2,   0.0f,   0.0f,  SQ2/2),
79
         new Static4D( SQ2/2,   0.0f,   0.0f, -SQ2/2),
80
         new Static4D(  0.0f,  SQ2/2,  SQ2/2,   0.0f),
81
         new Static4D(  0.0f,  SQ2/2, -SQ2/2,   0.0f),
82
         new Static4D(  0.0f,  SQ2/2,   0.0f,  SQ2/2),
83
         new Static4D(  0.0f,  SQ2/2,   0.0f, -SQ2/2),
84
         new Static4D(  0.0f,   0.0f,  SQ2/2,  SQ2/2),
85
         new Static4D(  0.0f,   0.0f,  SQ2/2, -SQ2/2),
86
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
         new Static4D( -0.5f,   0.5f,  -0.5f,  -0.5f),
93
         new Static4D( -0.5f,   0.5f,   0.5f,  -0.5f),
94
         new Static4D( -0.5f,   0.5f,   0.5f,   0.5f)
95 efef689c Leszek Koltunski
         };
96 411c6285 Leszek Koltunski
97 fbca0033 Leszek Koltunski
  private static MeshBase[] mMeshes;
98 40ab026e Leszek Koltunski
99 411c6285 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
100
101 4da7d87a Leszek Koltunski
  RubikCube(int size, Static4D quat, DistortedTexture texture,
102 5b893eee Leszek Koltunski
            MeshRectangles mesh, DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
103 411c6285 Leszek Koltunski
    {
104 5b893eee Leszek Koltunski
    super(size, 60, quat, texture, mesh, effects, moves, RubikObjectList.CUBE, res, scrWidth);
105 411c6285 Leszek Koltunski
    }
106
107 7289fd6c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
108 42803ba0 Leszek Koltunski
// paint the square with upper-right corner at (left,top) and side length 'side' with texture
109 7289fd6c Leszek Koltunski
// for face 'face'.
110
111
  void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top, int side)
112
    {
113
    final float R = side*0.10f;
114
    final float M = side*0.05f;
115
116
    paint.setColor(FACE_COLORS[face]);
117
    canvas.drawRoundRect( left+M, top+M, left+side-M, top+side-M, R, R, paint);
118
    }
119
120 411c6285 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
121
122 10a2e360 Leszek Koltunski
  Static3D[] getCubitPositions(int size)
123 a10ada2a Leszek Koltunski
    {
124 10a2e360 Leszek Koltunski
    int numCubits = size>1 ? 6*size*size - 12*size + 8 : 1;
125
    Static3D[] tmp = new Static3D[numCubits];
126 beb325a0 Leszek Koltunski
127 49f67f9b Leszek Koltunski
    float diff = 0.5f*(size-1);
128 a10ada2a Leszek Koltunski
    int currentPosition = 0;
129 beb325a0 Leszek Koltunski
130 a10ada2a Leszek Koltunski
    for(int x = 0; x<size; x++)
131
      for(int y = 0; y<size; y++)
132
        for(int z = 0; z<size; z++)
133
          if( x==0 || x==size-1 || y==0 || y==size-1 || z==0 || z==size-1 )
134 beb325a0 Leszek Koltunski
            {
135 49f67f9b Leszek Koltunski
            tmp[currentPosition++] = new Static3D(x-diff,y-diff,z-diff);
136 a10ada2a Leszek Koltunski
            }
137 47ba5ddc Leszek Koltunski
138 a10ada2a Leszek Koltunski
    return tmp;
139
    }
140 47ba5ddc Leszek Koltunski
141 beb325a0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
142
143 10585385 Leszek Koltunski
  Static4D[] getQuats()
144 a10ada2a Leszek Koltunski
    {
145 10585385 Leszek Koltunski
    return QUATS;
146 a10ada2a Leszek Koltunski
    }
147 47ba5ddc Leszek Koltunski
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149
150 411c6285 Leszek Koltunski
  int getNumFaces()
151 a10ada2a Leszek Koltunski
    {
152 411c6285 Leszek Koltunski
    return FACE_COLORS.length;
153 8f53e513 Leszek Koltunski
    }
154
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156
157
  int getNumCubitFaces()
158
    {
159
    return FACE_COLORS.length;
160 411c6285 Leszek Koltunski
    }
161 47ba5ddc Leszek Koltunski
162 f0fa83ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
163
164
  float getScreenRatio()
165
    {
166
    return 0.5f;
167
    }
168
169 f6d06256 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
170
171
  int getFaceColor(int cubit, int cubitface, int size)
172
    {
173
    boolean belongs = isOnFace(cubit, cubitface/2, cubitface%2==0 ? size-1:0 );
174
    return belongs ? cubitface : NUM_FACES;
175
    }
176
177 f0fa83ae Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
178
179 14bd7976 Leszek Koltunski
  MeshBase createCubitMesh(int cubit)
180 a10ada2a Leszek Koltunski
    {
181 fbca0033 Leszek Koltunski
    int size   = getSize();
182
    int ordinal= RubikObjectList.CUBE.ordinal();
183
    int index  = RubikObjectList.getSizeIndex(ordinal,size);
184
    float[] loc;
185
186
    switch(size)
187
      {
188
      case 5 : loc = new float[] { -0.5f, 0.05f, 0.1f, 0.35f, 0.35f, 0.1f, 0.05f };
189
               break;
190
      case 2 : loc = new float[] { -0.5f, 0.03f, 0.05f, 0.07f, 0.20f, 0.30f, 0.20f, 0.07f, 0.05f, 0.03f };
191
               break;
192
      default: loc = new float[] { -0.5f, 0.04f, 0.06f, 0.25f, 0.30f, 0.25f, 0.06f, 0.04f };
193
      }
194
195
    return createCubitMesh(index,loc);
196 55fa2499 Leszek Koltunski
    }
197
198
///////////////////////////////////////////////////////////////////////////////////////////////////
199
200 fbca0033 Leszek Koltunski
  MeshBase createCubitMesh(int index, float[] loc)
201 55fa2499 Leszek Koltunski
    {
202 fbca0033 Leszek Koltunski
    if( mMeshes==null )
203
      {
204
      mMeshes = new MeshBase[RubikObjectList.CUBE.getNumVariants()];
205
      }
206 55fa2499 Leszek Koltunski
207 fbca0033 Leszek Koltunski
    if( mMeshes[index]==null )
208 40ab026e Leszek Koltunski
      {
209
      final int MESHES=6;
210
      int association = 1;
211
      MeshBase[] meshes = new MeshRectangles[MESHES];
212 fbca0033 Leszek Koltunski
      meshes[0] = new MeshRectangles(loc,loc);
213 e82f3f9c Leszek Koltunski
      meshes[0].setEffectAssociation(0,association,0);
214 40ab026e Leszek Koltunski
215
      for(int i=1; i<MESHES; i++)
216
        {
217
        association <<=1;
218
        meshes[i] = meshes[0].copy(true);
219 e82f3f9c Leszek Koltunski
        meshes[i].setEffectAssociation(0,association,0);
220 40ab026e Leszek Koltunski
        }
221
222 fbca0033 Leszek Koltunski
      mMeshes[index] = new MeshJoined(meshes);
223 40ab026e Leszek Koltunski
224
      Static3D axisY   = new Static3D(0,1,0);
225
      Static3D axisX   = new Static3D(1,0,0);
226
      Static3D center  = new Static3D(0,0,0);
227
      Static1D angle90 = new Static1D(90);
228
      Static1D angle180= new Static1D(180);
229
      Static1D angle270= new Static1D(270);
230
231 14bd7976 Leszek Koltunski
      float d1 = 1.0f;
232
      float d2 =-0.05f;
233
      float d3 = 0.12f;
234
235
      Static3D dCen0 = new Static3D( d1*(+0.5f), d1*(+0.5f), d1*(+0.5f) );
236
      Static3D dCen1 = new Static3D( d1*(+0.5f), d1*(+0.5f), d1*(-0.5f) );
237
      Static3D dCen2 = new Static3D( d1*(+0.5f), d1*(-0.5f), d1*(+0.5f) );
238
      Static3D dCen3 = new Static3D( d1*(+0.5f), d1*(-0.5f), d1*(-0.5f) );
239
      Static3D dCen4 = new Static3D( d1*(-0.5f), d1*(+0.5f), d1*(+0.5f) );
240
      Static3D dCen5 = new Static3D( d1*(-0.5f), d1*(+0.5f), d1*(-0.5f) );
241
      Static3D dCen6 = new Static3D( d1*(-0.5f), d1*(-0.5f), d1*(+0.5f) );
242
      Static3D dCen7 = new Static3D( d1*(-0.5f), d1*(-0.5f), d1*(-0.5f) );
243
244
      Static3D dVec0 = new Static3D( d2*(+0.5f), d2*(+0.5f), d2*(+0.5f) );
245
      Static3D dVec1 = new Static3D( d2*(+0.5f), d2*(+0.5f), d2*(-0.5f) );
246
      Static3D dVec2 = new Static3D( d2*(+0.5f), d2*(-0.5f), d2*(+0.5f) );
247
      Static3D dVec3 = new Static3D( d2*(+0.5f), d2*(-0.5f), d2*(-0.5f) );
248
      Static3D dVec4 = new Static3D( d2*(-0.5f), d2*(+0.5f), d2*(+0.5f) );
249
      Static3D dVec5 = new Static3D( d2*(-0.5f), d2*(+0.5f), d2*(-0.5f) );
250
      Static3D dVec6 = new Static3D( d2*(-0.5f), d2*(-0.5f), d2*(+0.5f) );
251
      Static3D dVec7 = new Static3D( d2*(-0.5f), d2*(-0.5f), d2*(-0.5f) );
252
253
      Static4D dReg  = new Static4D(0,0,0,d3);
254
      Static1D dRad  = new Static1D(1);
255
256 40ab026e Leszek Koltunski
      VertexEffectMove   effect0 = new VertexEffectMove(new Static3D(0,0,+0.5f));
257 e82f3f9c Leszek Koltunski
      effect0.setMeshAssociation(63,-1);  // all 6 sides
258 40ab026e Leszek Koltunski
      VertexEffectRotate effect1 = new VertexEffectRotate( angle180, axisX, center );
259 e82f3f9c Leszek Koltunski
      effect1.setMeshAssociation(32,-1);  // back
260 40ab026e Leszek Koltunski
      VertexEffectRotate effect2 = new VertexEffectRotate( angle90 , axisX, center );
261 e82f3f9c Leszek Koltunski
      effect2.setMeshAssociation( 8,-1);  // bottom
262 40ab026e Leszek Koltunski
      VertexEffectRotate effect3 = new VertexEffectRotate( angle270, axisX, center );
263 e82f3f9c Leszek Koltunski
      effect3.setMeshAssociation( 4,-1);  // top
264 40ab026e Leszek Koltunski
      VertexEffectRotate effect4 = new VertexEffectRotate( angle270, axisY, center );
265 e82f3f9c Leszek Koltunski
      effect4.setMeshAssociation( 2,-1);  // left
266 40ab026e Leszek Koltunski
      VertexEffectRotate effect5 = new VertexEffectRotate( angle90 , axisY, center );
267 e82f3f9c Leszek Koltunski
      effect5.setMeshAssociation( 1,-1);  // right
268 40ab026e Leszek Koltunski
269 14bd7976 Leszek Koltunski
      VertexEffectDeform effect6 = new VertexEffectDeform(dVec0, dRad, dCen0, dReg);
270
      VertexEffectDeform effect7 = new VertexEffectDeform(dVec1, dRad, dCen1, dReg);
271
      VertexEffectDeform effect8 = new VertexEffectDeform(dVec2, dRad, dCen2, dReg);
272
      VertexEffectDeform effect9 = new VertexEffectDeform(dVec3, dRad, dCen3, dReg);
273
      VertexEffectDeform effect10= new VertexEffectDeform(dVec4, dRad, dCen4, dReg);
274
      VertexEffectDeform effect11= new VertexEffectDeform(dVec5, dRad, dCen5, dReg);
275
      VertexEffectDeform effect12= new VertexEffectDeform(dVec6, dRad, dCen6, dReg);
276
      VertexEffectDeform effect13= new VertexEffectDeform(dVec7, dRad, dCen7, dReg);
277
278
      VertexEffectSink   effect14= new VertexEffectSink( new Static1D(1.5f), center, new Static4D(0,0,0,0.72f) );
279
280 fbca0033 Leszek Koltunski
      mMeshes[index].apply(effect0);
281
      mMeshes[index].apply(effect1);
282
      mMeshes[index].apply(effect2);
283
      mMeshes[index].apply(effect3);
284
      mMeshes[index].apply(effect4);
285
      mMeshes[index].apply(effect5);
286
      mMeshes[index].apply(effect6);
287
      mMeshes[index].apply(effect7);
288
      mMeshes[index].apply(effect8);
289
      mMeshes[index].apply(effect9);
290
      mMeshes[index].apply(effect10);
291
      mMeshes[index].apply(effect11);
292
      mMeshes[index].apply(effect12);
293
      mMeshes[index].apply(effect13);
294
      mMeshes[index].apply(effect14);
295
296
      mMeshes[index].mergeEffComponents();
297 40ab026e Leszek Koltunski
      }
298 411c6285 Leszek Koltunski
299 fbca0033 Leszek Koltunski
    return mMeshes[index].copy(true);
300 a10ada2a Leszek Koltunski
    }
301 e844c116 Leszek Koltunski
302
///////////////////////////////////////////////////////////////////////////////////////////////////
303
// PUBLIC API
304
305 12ad3fca Leszek Koltunski
  public Static3D[] getRotationAxis()
306
    {
307
    return AXIS;
308
    }
309
310
///////////////////////////////////////////////////////////////////////////////////////////////////
311
312 e844c116 Leszek Koltunski
  public int getBasicAngle()
313
    {
314
    return 4;
315
    }
316 39e74052 Leszek Koltunski
317
///////////////////////////////////////////////////////////////////////////////////////////////////
318
319 9621255f Leszek Koltunski
  public float returnMultiplier()
320 39e74052 Leszek Koltunski
    {
321 9621255f Leszek Koltunski
    return getSize();
322 39e74052 Leszek Koltunski
    }
323 e46e17fb Leszek Koltunski
324 5cf34c5f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
325
326
  public float[] getRowChances()
327
    {
328
    int size = getSize();
329
    float[] chances = new float[size];
330
331
    for(int i=0; i<size; i++)
332
      {
333
      chances[i] = (i+1.0f) / size;
334
      }
335
336
    return chances;
337
    }
338
339 e46e17fb Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
340
341
  public float returnRotationFactor(float offset)
342
    {
343
    return 1.0f;
344
    }
345 f0336037 Leszek Koltunski
346
///////////////////////////////////////////////////////////////////////////////////////////////////
347 a304ee64 Leszek Koltunski
// order: Up --> Right --> Front --> Down --> Left --> Back
348
// (because the first implemented Solver - the two-phase Cube3 one - expects such order)
349
//
350 fa0f7a56 Leszek Koltunski
// Solved 3x3x3 Cube maps to "UUUUUUUUURRRRRRRRRFFFFFFFFFDDDDDDDDDLLLLLLLLLBBBBBBBBB"
351 a304ee64 Leszek Koltunski
//
352 fa0f7a56 Leszek Koltunski
// s : size of the cube; let index = a*s + b    (i.e. a,b = row,column)
353
//
354
// Up    :   index --> b<s-1 ? (s-1)*(s+4b)+a : 6*s*s -13*s +8 +a
355 a304ee64 Leszek Koltunski
// Right :   index --> 6*s*s - 12*s + 7 - index
356 fa0f7a56 Leszek Koltunski
// Front :   index --> if b==0  : s*s - 1 - index
357
//                     if b==s-1: 6*s*s -11*s +6 - index
358
//                     else
359
//                         a==0: s*s + s-1 + 4*(b-1)*(s-1) + 2*(s-2) + s
360
//                         else: s*s + s-1 + 4*(b-1)*(s-1) + 2*(s-1-a)
361
// Down  :   index --> b==0 ? (s-1-a) : s*s + s-1 + 4*(b-1)*(s-1) - a
362
// Left  :   index --> (s-1-a)*s + b
363
// Back  :   index --> if b==s-1: s*(s-1-a)
364
//                     if b==0  : 5*s*s -12*s + 8 + (s-1-a)*s
365
//                     else
366
//                        if a==s-1: s*s + 4*(s-2-b)*(s-1)
367
//                        else     : s*s + 4*(s-2-b)*(s-1) + s + (s-2-a)*2
368 f0336037 Leszek Koltunski
369 20931cf6 Leszek Koltunski
  public String retObjectString()
370 f0336037 Leszek Koltunski
    {
371 fa0f7a56 Leszek Koltunski
    StringBuilder objectString = new StringBuilder();
372
    int size = getSize();
373
    int len = size*size;
374
    int cubitIndex, row, col;
375
    int color;
376
377
    final int RIGHT= 0;
378
    final int LEFT = 1;
379
    final int UP   = 2;
380
    final int DOWN = 3;
381
    final int FRONT= 4;
382
    final int BACK = 5;
383
384
    final char[] FACE_NAMES = { 'R', 'L', 'U', 'D', 'F', 'B'};
385
386
    for(int i=0; i<len; i++)
387
      {
388
      row = i/size;
389
      col = i%size;
390
391
      cubitIndex = col<size-1 ? (size-1)*(size+4*col) + row : 6*size*size - 13*size + 8 + row;
392
      color = getCubitFaceColorIndex(cubitIndex,UP);
393
      objectString.append(FACE_NAMES[color]);
394
      }
395
396
    for(int i=0; i<len; i++)
397
      {
398
      cubitIndex = 6*size*size - 12*size +7 - i;
399
      color = getCubitFaceColorIndex(cubitIndex,RIGHT);
400
      objectString.append(FACE_NAMES[color]);
401
      }
402
403
    for(int i=0; i<len; i++)
404
      {
405
      row = i/size;
406
      col = i%size;
407
408
      if( col==size-1 ) cubitIndex = 6*size*size - 11*size + 6 -i;
409
      else if( col==0 ) cubitIndex = size*size - 1 - i;
410
      else
411
        {
412
        if( row==0 ) cubitIndex = size*size + size-1 + 4*(col-1)*(size-1) + 2*(size-2) + size;
413
        else         cubitIndex = size*size + size-1 + 4*(col-1)*(size-1) + 2*(size-1-row);
414
        }
415
416
      color = getCubitFaceColorIndex(cubitIndex,FRONT);
417
      objectString.append(FACE_NAMES[color]);
418
      }
419
420
    for(int i=0; i<len; i++)
421
      {
422
      row = i/size;
423
      col = i%size;
424
425
      cubitIndex = col==0 ? size-1-row : size*size + size-1 + 4*(col-1)*(size-1) - row;
426
      color = getCubitFaceColorIndex(cubitIndex,DOWN);
427
      objectString.append(FACE_NAMES[color]);
428
      }
429
430
    for(int i=0; i<len; i++)
431
      {
432
      row = i/size;
433
      col = i%size;
434
435
      cubitIndex = (size-1-row)*size + col;
436
      color = getCubitFaceColorIndex(cubitIndex,LEFT);
437
      objectString.append(FACE_NAMES[color]);
438
      }
439
440
    for(int i=0; i<len; i++)
441
      {
442
      row = i/size;
443
      col = i%size;
444
445
      if( col==size-1 ) cubitIndex = size*(size-1-row);
446
      else if( col==0 ) cubitIndex = 5*size*size - 12*size + 8 + (size-1-row)*size;
447
      else
448
        {
449
        if( row==size-1 ) cubitIndex = size*size + 4*(size-2-col)*(size-1);
450
        else              cubitIndex = size*size + 4*(size-2-col)*(size-1) + size + 2*(size-2-row);
451
        }
452
453
      color = getCubitFaceColorIndex(cubitIndex,BACK);
454
      objectString.append(FACE_NAMES[color]);
455
      }
456
457
    return objectString.toString();
458 f0336037 Leszek Koltunski
    }
459 0c52af30 Leszek Koltunski
}