Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyMegaminx.java @ 7d8cc029

1 a64e07d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// 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
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// 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
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.objects;
21
22
import android.content.res.Resources;
23
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 a64e07d0 Leszek Koltunski
import org.distorted.library.effect.MatrixEffectQuaternion;
29
import org.distorted.library.main.DistortedEffects;
30
import org.distorted.library.main.DistortedTexture;
31
import org.distorted.library.mesh.MeshBase;
32
import org.distorted.library.mesh.MeshSquare;
33
import org.distorted.library.type.Static3D;
34
import org.distorted.library.type.Static4D;
35
import org.distorted.main.R;
36
import org.distorted.main.RubikSurfaceView;
37
38 749ef882 Leszek Koltunski
import static org.distorted.helpers.FactoryCubit.COS18;
39
import static org.distorted.helpers.FactoryCubit.COS54;
40
import static org.distorted.helpers.FactoryCubit.SIN18;
41
import static org.distorted.helpers.FactoryCubit.SIN54;
42 3d8237cc Leszek Koltunski
43 a64e07d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
44
45
public class TwistyMegaminx extends TwistyMinx
46
{
47 e4bf4d02 Leszek Koltunski
  static final float MEGA_D = 0.04f;
48 a64e07d0 Leszek Koltunski
49 e4bf4d02 Leszek Koltunski
  private static final int[] QUAT_CENTER_INDICES =
50
      {
51
        16, 18, 22,  1, 20, 13, 14, 15,  0, 12,  2,  3
52
      };
53
54 d38f1397 Leszek Koltunski
  private static MeshBase[] mCenterMeshes, mCornerMeshes;
55
  private static MeshBase[][] mEdgeMeshes;
56
57 a64e07d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
58
59
  TwistyMegaminx(int size, Static4D quat, DistortedTexture texture, MeshSquare mesh,
60
                 DistortedEffects effects, int[][] moves, Resources res, int scrWidth)
61
    {
62
    super(size, size, quat, texture, mesh, effects, moves, ObjectList.MEGA, res, scrWidth);
63
    }
64
65
///////////////////////////////////////////////////////////////////////////////////////////////////
66
67
  private int numCubitsPerCorner(int numLayers)
68
    {
69
    return 3*((numLayers-1)/2)*((numLayers-3)/2) + 1;
70
    }
71
72
///////////////////////////////////////////////////////////////////////////////////////////////////
73
74
  private int numCubitsPerEdge(int numLayers)
75
    {
76
    return numLayers-2;
77
    }
78
79 ab210d63 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
80
81
  float getScreenRatio()
82
    {
83
    return 1.07f;
84
    }
85
86 a64e07d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
87
88
  int getNumStickerTypes(int numLayers)
89
    {
90 e4bf4d02 Leszek Koltunski
    return (numLayers+3)/2;
91 a64e07d0 Leszek Koltunski
    }
92
93
///////////////////////////////////////////////////////////////////////////////////////////////////
94
95
  float[] getCuts(int numLayers)
96
    {
97
    float[] cuts = new float[numLayers-1];
98 ede1b68c Leszek Koltunski
    float D = numLayers*MovementMinx.DIST3D;
99 a64e07d0 Leszek Koltunski
    float E = 2*C1;           // 2*cos(36 deg)
100
    float X = 2*D*E/(1+2*E);  // height of the 'upper' part of a dodecahedron, i.e. put it on a table,
101 ede1b68c Leszek Koltunski
                              // its height is then D*2*DIST3D, it has one 'lower' part of height X, one
102 a64e07d0 Leszek Koltunski
                              // 'middle' part of height Y and one upper part of height X again.
103
                              // It's edge length = numLayers/3.0f.
104
    int num = (numLayers-1)/2;
105
    float G = X*(0.5f-MEGA_D)/num; // height of one Layer
106
107
    for(int i=0; i<num; i++)
108
      {
109 ede1b68c Leszek Koltunski
      cuts[        i] = -D + (i+0.5f)*G;
110 a64e07d0 Leszek Koltunski
      cuts[2*num-1-i] = -cuts[i];
111
      }
112
113
    return cuts;
114
    }
115
116
///////////////////////////////////////////////////////////////////////////////////////////////////
117
118 e6cf7283 Leszek Koltunski
  private float[] computeCenter(int center, int numLayers)
119 a64e07d0 Leszek Koltunski
    {
120 d38f1397 Leszek Koltunski
    float[] coords = mCenterCoords[center];
121 e4bf4d02 Leszek Koltunski
    float A = numLayers/3.0f;
122
123 e6cf7283 Leszek Koltunski
    return new float[] { A*coords[0], A*coords[1], A*coords[2] };
124 a64e07d0 Leszek Koltunski
    }
125
126
///////////////////////////////////////////////////////////////////////////////////////////////////
127 d38f1397 Leszek Koltunski
// Fill out mCurrCorner{X,Y,Z} by applying appropriate Quat to mBasicCorner{X,Y,Z}
128 a64e07d0 Leszek Koltunski
// Appropriate one: QUATS[QUAT_INDICES[corner]].
129
130 d38f1397 Leszek Koltunski
  private void computeBasicCornerVectors(int corner)
131 a64e07d0 Leszek Koltunski
    {
132 d38f1397 Leszek Koltunski
    Static4D quat = QUATS[QUAT_CORNER_INDICES[corner]];
133 a64e07d0 Leszek Koltunski
134 d38f1397 Leszek Koltunski
    mCurrCornerV[0] = RubikSurfaceView.rotateVectorByQuat(mBasicCornerV[0],quat);
135
    mCurrCornerV[1] = RubikSurfaceView.rotateVectorByQuat(mBasicCornerV[1],quat);
136
    mCurrCornerV[2] = RubikSurfaceView.rotateVectorByQuat(mBasicCornerV[2],quat);
137 a64e07d0 Leszek Koltunski
    }
138
139
///////////////////////////////////////////////////////////////////////////////////////////////////
140
141 e6cf7283 Leszek Koltunski
  private float[] computeCorner(int numCubitsPerCorner, int numLayers, int corner, int part)
142 a64e07d0 Leszek Koltunski
    {
143
    float D = numLayers/3.0f;
144 e6cf7283 Leszek Koltunski
    float[] corn = CORNERS[corner];
145 a64e07d0 Leszek Koltunski
146
    if( part==0 )
147
      {
148 e6cf7283 Leszek Koltunski
      return new float[] { corn[0]*D, corn[1]*D, corn[2]*D };
149 a64e07d0 Leszek Koltunski
      }
150
    else
151
      {
152 ead91342 Leszek Koltunski
      float E = 2.0f*D*(0.5f-MEGA_D)/(0.5f*(numLayers-1));
153 a64e07d0 Leszek Koltunski
      int N = (numCubitsPerCorner-1)/3;
154 6e7146df Leszek Koltunski
      int block = (part-1) % N;
155
      int index = (part-1) / N;
156 d38f1397 Leszek Koltunski
      Static4D pri = mCurrCornerV[index];
157
      Static4D sec = mCurrCornerV[(index+2)%3];
158 a64e07d0 Leszek Koltunski
159 7764a67a Leszek Koltunski
      int layers= (numLayers-3)/2;
160 ead91342 Leszek Koltunski
      int multP = (block % layers) + 1;
161
      int multS = (block / layers);
162 a64e07d0 Leszek Koltunski
163 e6cf7283 Leszek Koltunski
      return new float[] {
164
                          corn[0]*D + (pri.get0()*multP + sec.get0()*multS)*E,
165
                          corn[1]*D + (pri.get1()*multP + sec.get1()*multS)*E,
166
                          corn[2]*D + (pri.get2()*multP + sec.get2()*multS)*E
167
                         };
168 a64e07d0 Leszek Koltunski
      }
169
    }
170
171
///////////////////////////////////////////////////////////////////////////////////////////////////
172
173 d38f1397 Leszek Koltunski
  private int computeEdgeType(int cubit, int numCubitsPerCorner, int numCubitsPerEdge)
174 a64e07d0 Leszek Koltunski
    {
175 d38f1397 Leszek Koltunski
    int part = (cubit - NUM_CORNERS*numCubitsPerCorner) % numCubitsPerEdge;
176
    return (part+1)/2;
177
    }
178 a64e07d0 Leszek Koltunski
179 d38f1397 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
180
181 e6cf7283 Leszek Koltunski
  private float[] computeEdge(int numLayers, int edge, int part)
182 d38f1397 Leszek Koltunski
    {
183 ead91342 Leszek Koltunski
    float D = numLayers/3.0f;
184 3d8237cc Leszek Koltunski
185 e6cf7283 Leszek Koltunski
    float[] c1 = CORNERS[ mEdgeMap[edge][0] ];
186
    float[] c2 = CORNERS[ mEdgeMap[edge][1] ];
187 ead91342 Leszek Koltunski
    float x = D * (c1[0]+c2[0]) / 2;
188
    float y = D * (c1[1]+c2[1]) / 2;
189
    float z = D * (c1[2]+c2[2]) / 2;
190 d38f1397 Leszek Koltunski
191
    if( part==0 )
192
      {
193 e6cf7283 Leszek Koltunski
      return new float[] { x, y, z };
194 d38f1397 Leszek Koltunski
      }
195
    else
196
      {
197
      int mult = (part+1)/2;
198
      int dir  = (part+1)%2;
199
      float[] center = mCenterCoords[ mEdgeMap[edge][dir+2] ];
200
201 ead91342 Leszek Koltunski
      float vX = D*center[0] - x;
202
      float vY = D*center[1] - y;
203
      float vZ = D*center[2] - z;
204 d38f1397 Leszek Koltunski
205 ead91342 Leszek Koltunski
      float A = mult*D*(0.5f-MEGA_D)*COS18/((numLayers-1)*0.5f);
206
      A /= (float)Math.sqrt(vX*vX+vY*vY+vZ*vZ);
207 d38f1397 Leszek Koltunski
208 e6cf7283 Leszek Koltunski
      return new float[] { x+A*vX, y+A*vY, z+A*vZ };
209 d38f1397 Leszek Koltunski
      }
210 a64e07d0 Leszek Koltunski
    }
211
212
///////////////////////////////////////////////////////////////////////////////////////////////////
213
214 e6cf7283 Leszek Koltunski
  float[][] getCubitPositions(int numLayers)
215 a64e07d0 Leszek Koltunski
    {
216
    int numCubitsPerCorner = numCubitsPerCorner(numLayers);
217 d38f1397 Leszek Koltunski
    int numCubitsPerEdge   = numCubitsPerEdge(numLayers);
218 e4bf4d02 Leszek Koltunski
    int numCubits = NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge + NUM_CENTERS;
219 a64e07d0 Leszek Koltunski
    int index=0;
220
221 e6cf7283 Leszek Koltunski
    final float[][] CENTERS = new float[numCubits][];
222 a64e07d0 Leszek Koltunski
223
    for(int corner=0; corner<NUM_CORNERS; corner++)
224
      {
225 d38f1397 Leszek Koltunski
      computeBasicCornerVectors(corner);
226 a64e07d0 Leszek Koltunski
227
      for(int part=0; part<numCubitsPerCorner; part++, index++)
228
        {
229 e6cf7283 Leszek Koltunski
        CENTERS[index] = computeCorner(numCubitsPerCorner,numLayers,corner,part);
230 a64e07d0 Leszek Koltunski
        }
231
      }
232 d38f1397 Leszek Koltunski
233 a64e07d0 Leszek Koltunski
    for(int edge=0; edge<NUM_EDGES; edge++)
234
      {
235
      for(int part=0; part<numCubitsPerEdge; part++, index++)
236
        {
237 e6cf7283 Leszek Koltunski
        CENTERS[index] = computeEdge(numLayers, edge, part );
238 a64e07d0 Leszek Koltunski
        }
239
      }
240 e4bf4d02 Leszek Koltunski
241 a64e07d0 Leszek Koltunski
    for(int center=0; center<NUM_CENTERS; center++, index++)
242
      {
243 e6cf7283 Leszek Koltunski
      CENTERS[index] = computeCenter(center, numLayers);
244 a64e07d0 Leszek Koltunski
      }
245 e4bf4d02 Leszek Koltunski
246 a64e07d0 Leszek Koltunski
    return CENTERS;
247
    }
248
249
///////////////////////////////////////////////////////////////////////////////////////////////////
250
251 e4bf4d02 Leszek Koltunski
  private int getQuat(int cubit, int numCubitsPerCorner, int numCubitsPerEdge)
252 a64e07d0 Leszek Koltunski
    {
253
    if( cubit < NUM_CORNERS*numCubitsPerCorner )
254
      {
255
      int corner = cubit/numCubitsPerCorner;
256 d38f1397 Leszek Koltunski
      return QUAT_CORNER_INDICES[corner];
257 a64e07d0 Leszek Koltunski
      }
258
259 d38f1397 Leszek Koltunski
    if( cubit < NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge )
260
      {
261
      int edge = (cubit-NUM_CORNERS*numCubitsPerCorner)/numCubitsPerEdge;
262
      return QUAT_EDGE_INDICES[edge];
263
      }
264
265 e4bf4d02 Leszek Koltunski
    int center = cubit - NUM_CORNERS*numCubitsPerCorner - NUM_EDGES*numCubitsPerEdge;
266
    return QUAT_CENTER_INDICES[center];
267 a64e07d0 Leszek Koltunski
    }
268
269
///////////////////////////////////////////////////////////////////////////////////////////////////
270
271
  MeshBase createCubitMesh(int cubit, int numLayers)
272
    {
273
    int numCubitsPerCorner = numCubitsPerCorner(numLayers);
274
    int numCubitsPerEdge   = numCubitsPerEdge(numLayers);
275 28b54fe3 Leszek Koltunski
    int index = (numLayers-3)/2;
276 db608887 Leszek Koltunski
    int[] sizes = ObjectList.MEGA.getSizes();
277
    int variants = sizes.length;
278 a64e07d0 Leszek Koltunski
    MeshBase mesh;
279
280 d38f1397 Leszek Koltunski
    if( mCornerMeshes==null ) mCornerMeshes = new MeshBase[variants];
281 db608887 Leszek Koltunski
    if( mEdgeMeshes  ==null ) mEdgeMeshes   = new MeshBase[variants][(sizes[variants-1]-1)/2];
282 e4bf4d02 Leszek Koltunski
    if( mCenterMeshes==null ) mCenterMeshes = new MeshBase[variants];
283 28b54fe3 Leszek Koltunski
284 d38f1397 Leszek Koltunski
    if( cubit < NUM_CORNERS*numCubitsPerCorner )
285 a64e07d0 Leszek Koltunski
      {
286 d38f1397 Leszek Koltunski
      if( mCornerMeshes[index]==null )
287
        {
288 16f34a98 Leszek Koltunski
        float width = (numLayers/3.0f)*(0.5f-MEGA_D)/(0.5f*(numLayers-1));
289
        mCornerMeshes[index] = FactoryCubit.getInstance().createMinxCornerMesh(numLayers, width);
290 d38f1397 Leszek Koltunski
        }
291 28b54fe3 Leszek Koltunski
      mesh = mCornerMeshes[index].copy(true);
292 a64e07d0 Leszek Koltunski
      }
293 e4bf4d02 Leszek Koltunski
    else if( cubit<NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge )
294 a64e07d0 Leszek Koltunski
      {
295 d38f1397 Leszek Koltunski
      int type = computeEdgeType(cubit,numCubitsPerCorner,numCubitsPerEdge);
296
297
      if( mEdgeMeshes[index][type]==null )
298
        {
299 3d8237cc Leszek Koltunski
        float height= (numLayers/3.0f)*(0.5f-MEGA_D)*COS18/((numLayers-1)*0.5f);
300
        float width = (numLayers/3.0f)*2*MEGA_D + 2*type*height*SIN18/COS18;
301
302 61b217a5 Leszek Koltunski
        mEdgeMeshes[index][type] = FactoryCubit.getInstance().createMegaminxEdgeMesh(numLayers,width,height);
303 d38f1397 Leszek Koltunski
        }
304
305
      mesh = mEdgeMeshes[index][type].copy(true);
306 a64e07d0 Leszek Koltunski
      }
307
    else
308
      {
309 e4bf4d02 Leszek Koltunski
      if( mCenterMeshes[index]==null )
310
        {
311
        float width = 2 * (numLayers/3.0f) * (MEGA_D+(0.5f-MEGA_D)*SIN18);
312 61b217a5 Leszek Koltunski
        mCenterMeshes[index] = FactoryCubit.getInstance().createMegaminxCenterMesh(numLayers,width);
313 e4bf4d02 Leszek Koltunski
        }
314
315
      mesh = mCenterMeshes[index].copy(true);
316 a64e07d0 Leszek Koltunski
      }
317 e4bf4d02 Leszek Koltunski
318
    Static4D q = QUATS[getQuat(cubit,numCubitsPerCorner,numCubitsPerEdge)];
319 3d8237cc Leszek Koltunski
    MatrixEffectQuaternion quat = new MatrixEffectQuaternion( q, new Static3D(0,0,0) );
320 a64e07d0 Leszek Koltunski
    mesh.apply(quat,0xffffffff,0);
321
322
    return mesh;
323
    }
324
325
///////////////////////////////////////////////////////////////////////////////////////////////////
326
327 d38f1397 Leszek Koltunski
  int getCornerColor(int cubit, int cubitface, int numLayers, int numCubitsPerCorner)
328 a64e07d0 Leszek Koltunski
    {
329 0e7a13b4 Leszek Koltunski
    if( cubitface<0 || cubitface>2 ) return NUM_TEXTURES;
330 6e7146df Leszek Koltunski
331
    int part  = cubit % numCubitsPerCorner;
332 a64e07d0 Leszek Koltunski
    int corner= cubit / numCubitsPerCorner;
333
334 6e7146df Leszek Koltunski
    if( part==0 )
335 a64e07d0 Leszek Koltunski
      {
336 6e7146df Leszek Koltunski
      return mCornerFaceMap[corner][cubitface];
337 a64e07d0 Leszek Koltunski
      }
338
    else
339
      {
340
      int N = (numCubitsPerCorner-1)/3;
341 6e7146df Leszek Koltunski
      int block = (part-1) % N;
342
      int index = (part-1) / N;
343 a64e07d0 Leszek Koltunski
344 0e7a13b4 Leszek Koltunski
      if( block< (numLayers-3)/2 )
345 a64e07d0 Leszek Koltunski
        {
346 6e7146df Leszek Koltunski
        switch(index)
347
          {
348 0e7a13b4 Leszek Koltunski
          case 0: return cubitface==1 ? NUM_TEXTURES : mCornerFaceMap[corner][cubitface];
349
          case 1: return cubitface==0 ? NUM_TEXTURES : mCornerFaceMap[corner][cubitface];
350
          case 2: return cubitface==2 ? NUM_TEXTURES : mCornerFaceMap[corner][cubitface];
351 6e7146df Leszek Koltunski
          }
352 a64e07d0 Leszek Koltunski
        }
353
      else
354
        {
355 6e7146df Leszek Koltunski
        switch(index)
356
          {
357 0e7a13b4 Leszek Koltunski
          case 0: return cubitface==0 ? mCornerFaceMap[corner][cubitface] : NUM_TEXTURES;
358
          case 1: return cubitface==2 ? mCornerFaceMap[corner][cubitface] : NUM_TEXTURES;
359
          case 2: return cubitface==1 ? mCornerFaceMap[corner][cubitface] : NUM_TEXTURES;
360 6e7146df Leszek Koltunski
          }
361 a64e07d0 Leszek Koltunski
        }
362
      }
363 6e7146df Leszek Koltunski
364 0e7a13b4 Leszek Koltunski
    return NUM_TEXTURES;
365 a64e07d0 Leszek Koltunski
    }
366
367 d38f1397 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
368
369 e4bf4d02 Leszek Koltunski
  int getEdgeColor(int edge, int cubitface, int numCubitsPerEdge)
370 d38f1397 Leszek Koltunski
    {
371 0e7a13b4 Leszek Koltunski
    if( cubitface<0 || cubitface>1 ) return NUM_TEXTURES;
372 d38f1397 Leszek Koltunski
373 e4bf4d02 Leszek Koltunski
    int part    = edge % numCubitsPerEdge;
374
    int variant = edge / numCubitsPerEdge;
375 d38f1397 Leszek Koltunski
376 51df47f3 Leszek Koltunski
    return (part==0 || cubitface==((part+1)%2)) ? mEdgeMap[variant][cubitface+2] + ((part+3)/2)*NUM_FACES : NUM_TEXTURES;
377 d38f1397 Leszek Koltunski
    }
378
379
///////////////////////////////////////////////////////////////////////////////////////////////////
380
381 e4bf4d02 Leszek Koltunski
  int getCenterColor(int center, int cubitface, int numLayers)
382 d38f1397 Leszek Koltunski
    {
383 e4bf4d02 Leszek Koltunski
    return cubitface>0 ? NUM_TEXTURES : center + NUM_FACES*(numLayers+1)/2;
384 d38f1397 Leszek Koltunski
    }
385
386
///////////////////////////////////////////////////////////////////////////////////////////////////
387
388
  int getFaceColor(int cubit, int cubitface, int numLayers)
389
    {
390
    int numCubitsPerCorner = numCubitsPerCorner(numLayers);
391
    int numCubitsPerEdge   = numCubitsPerEdge(numLayers);
392
393
    if( cubit < NUM_CORNERS*numCubitsPerCorner )
394
      {
395
      return getCornerColor(cubit,cubitface,numLayers,numCubitsPerCorner);
396
      }
397
    else if( cubit<NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge )
398
      {
399 e4bf4d02 Leszek Koltunski
      int edge = cubit - NUM_CORNERS*numCubitsPerCorner;
400
      return getEdgeColor(edge,cubitface,numCubitsPerEdge);
401 d38f1397 Leszek Koltunski
      }
402
    else
403
      {
404 e4bf4d02 Leszek Koltunski
      int center = cubit-NUM_CORNERS*numCubitsPerCorner-NUM_EDGES*numCubitsPerEdge;
405
      return getCenterColor( center, cubitface, numLayers);
406 d38f1397 Leszek Koltunski
      }
407
    }
408
409 a64e07d0 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
410
411
  void createFaceTexture(Canvas canvas, Paint paint, int face, int left, int top)
412
    {
413 ede1b68c Leszek Koltunski
    int COLORS = FACE_COLORS.length;
414
    float R,S;
415
    float[] vertices;
416
417
    int variant = face/COLORS;
418
419
    if( variant==0 )
420
      {
421
      float Y = COS54/(2*SIN54);
422 329d21a5 Leszek Koltunski
      R = 0.070f;
423 673d7b24 Leszek Koltunski
      S = 0.08f;
424 ede1b68c Leszek Koltunski
      vertices = new float[] { -0.5f, 0.0f, 0.0f, -Y, 0.5f, 0.0f, 0.0f, Y };
425
      }
426
    else
427
      {
428
      int numLayers = getNumLayers();
429
      float height= (numLayers/3.0f)*(0.5f-MEGA_D)*COS18/((numLayers-1)*0.5f);
430
      float W = height*SIN18/COS18;
431
      float width = (numLayers/3.0f)*2*MEGA_D + 2*(variant-1)*W;
432
433
      if( variant < (numLayers+1)/2 )
434
        {
435
        float X1 = 0.5f*height;
436
        float Y1 = 0.5f*width;
437
        float Y2 = 0.5f*width + W;
438
439 329d21a5 Leszek Koltunski
        R = 0.05f;
440 ca824448 Leszek Koltunski
        S = 0.06f;
441 ede1b68c Leszek Koltunski
        vertices = new float[] { -X1, Y1, -X1, -Y1, X1, -Y2, X1, Y2 };
442
        }
443
      else
444
        {
445 ed01e351 Leszek Koltunski
        float Z  = 0.5f;
446
        float X1 = Z*COS54;
447 ede1b68c Leszek Koltunski
        float Y1 = Z*SIN54;
448
        float X2 = Z*COS18;
449
        float Y2 = Z*SIN18;
450
451 ed01e351 Leszek Koltunski
        R = 0.10f;
452 673d7b24 Leszek Koltunski
        S = 0.08f;
453 ede1b68c Leszek Koltunski
        vertices = new float[] { -X1,+Y1, -X2,-Y2, 0.0f,-Z, +X2,-Y2, +X1,+Y1 };
454
        }
455
      }
456
457
    FactorySticker factory = FactorySticker.getInstance();
458
    factory.drawRoundedPolygon(canvas, paint, left, top, vertices, S, FACE_COLORS[face%COLORS], R);
459 a64e07d0 Leszek Koltunski
    }
460
461
///////////////////////////////////////////////////////////////////////////////////////////////////
462
// PUBLIC API
463
464
  public boolean isSolved()
465
    {
466
    int index = CUBITS[0].mQuatIndex;
467
468
    for(int i=1; i<NUM_CUBITS; i++)
469
      {
470 722b2512 Leszek Koltunski
      if( thereIsVisibleDifference(CUBITS[i], index) ) return false;
471 a64e07d0 Leszek Koltunski
      }
472
473
    return true;
474
    }
475
476
///////////////////////////////////////////////////////////////////////////////////////////////////
477
478
  public int getObjectName(int numLayers)
479
    {
480
    if( numLayers==3 ) return R.string.minx3;
481 f6e46300 Leszek Koltunski
    if( numLayers==5 ) return R.string.minx5;
482 a64e07d0 Leszek Koltunski
483
    return 0;
484
    }
485
486
///////////////////////////////////////////////////////////////////////////////////////////////////
487
488
  public int getInventor(int numLayers)
489
    {
490
    if( numLayers==3 ) return R.string.minx3_inventor;
491 f6e46300 Leszek Koltunski
    if( numLayers==5 ) return R.string.minx5_inventor;
492 a64e07d0 Leszek Koltunski
493
    return 0;
494
    }
495
496
///////////////////////////////////////////////////////////////////////////////////////////////////
497
498
  public int getComplexity(int numLayers)
499
    {
500
    if( numLayers==3 ) return 4;
501
502
    return 5;
503
    }
504
}