Project

General

Profile

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

magiccube / src / main / java / org / distorted / objects / TwistyMinx.java @ efa81f0c

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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

    
24
import org.distorted.helpers.ObjectSticker;
25
import org.distorted.helpers.ScrambleState;
26
import org.distorted.library.main.DistortedEffects;
27
import org.distorted.library.main.DistortedTexture;
28
import org.distorted.library.mesh.MeshSquare;
29
import org.distorted.library.type.Static3D;
30
import org.distorted.library.type.Static4D;
31

    
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33

    
34
abstract class TwistyMinx extends Twisty12
35
{
36
  static final int NUM_CORNERS = 20;
37
  static final int NUM_CENTERS = 12;
38
  static final int NUM_EDGES   = 30;
39

    
40
  static final float C2       = (SQ5+3)/4;
41
  static final float LEN      = (float)(Math.sqrt(1.25f+0.5f*SQ5));
42
  static final float SIN54    = (SQ5+1)/4;
43
  static final float COS54    = (float)(Math.sqrt(10-2*SQ5)/4);
44
  static final float SIN18    = (SQ5-1)/4;
45
  static final float COS18    = (float)(0.25f*Math.sqrt(10.0f+2.0f*SQ5));
46
  static final float COS_HALFD= (float)(Math.sqrt(0.5f-0.1f*SQ5)); // cos(half the dihedral angle)
47
  static final float SIN_HALFD= (float)(Math.sqrt(0.5f+0.1f*SQ5)); // sin(half the dihedral angle)
48

    
49
  // the six rotation axis of a Minx. Must be normalized.
50
  static final Static3D[] ROT_AXIS = new Static3D[]
51
         {
52
           new Static3D(    C2/LEN, SIN54/LEN,    0      ),
53
           new Static3D(   -C2/LEN, SIN54/LEN,    0      ),
54
           new Static3D( 0        ,    C2/LEN, SIN54/LEN ),
55
           new Static3D( 0        ,   -C2/LEN, SIN54/LEN ),
56
           new Static3D( SIN54/LEN,    0     ,    C2/LEN ),
57
           new Static3D( SIN54/LEN,    0     ,   -C2/LEN )
58
         };
59

    
60
  private ScrambleState[] mStates;
61
  private int[] mBasicAngle;
62
  private int[] mFaceMap;
63
  private Movement mMovement;
64
  Static4D[] mQuats;
65
  float[][] mCenterCoords;
66
  float[][] mCorners;
67
  int[][] mCornerFaceMap;
68
  int[] mQuatEdgeIndices;
69
  int[] mQuatCornerIndices;
70
  int[][] mEdgeMap;
71
  int[][] mCenterMap;
72
  Static4D[] mBasicCornerV, mCurrCornerV;
73
  ObjectSticker[] mStickers;
74

    
75
///////////////////////////////////////////////////////////////////////////////////////////////////
76

    
77
  TwistyMinx(int numLayers, int realSize, Static4D quat, DistortedTexture texture, MeshSquare mesh,
78
             DistortedEffects effects, int[][] moves, ObjectList obj, Resources res, int scrWidth)
79
    {
80
    super(numLayers, realSize, quat, texture, mesh, effects, moves, obj, res, scrWidth);
81
    }
82

    
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84

    
85
  ScrambleState[] getScrambleStates()
86
    {
87
    if( mStates==null )
88
      {
89
      int numLayers = getNumLayers();
90
      initializeScrambleStates(numLayers);
91
      }
92

    
93
    return mStates;
94
    }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
  void initializeCornerV()
99
    {
100
    mBasicCornerV = new Static4D[3];
101
    mCurrCornerV  = new Static4D[3];
102

    
103
    mBasicCornerV[0] = new Static4D( (SQ5+1)*0.375f, (SQ5-1)*0.375f, -0.750f, 0.0f );
104
    mBasicCornerV[1] = new Static4D(-(SQ5+1)*0.375f, (SQ5-1)*0.375f, -0.750f, 0.0f );
105
    mBasicCornerV[2] = new Static4D(              0,        -1.500f,    0.0f, 0.0f );
106
    }
107

    
108
///////////////////////////////////////////////////////////////////////////////////////////////////
109
// the five vertices that form a given face. Order: the same as colors of the faces in TwistyMinx.
110

    
111
  void initializeCenterMap()
112
    {
113
    mCenterMap = new int[][]
114
         {
115
           { 0, 12,  4, 14,  2},
116
           { 0,  2, 18,  6, 16},
117
           { 6, 18, 11, 19,  7},
118
           { 3, 15,  9, 11, 19},
119
           { 4,  5, 15,  9, 14},
120
           { 1, 13,  5, 15,  3},
121
           { 1,  3, 19,  7, 17},
122
           {10, 16,  6,  7, 17},
123
           { 0, 12,  8, 10, 16},
124
           { 8, 13,  5,  4, 12},
125
           { 1, 13,  8, 10, 17},
126
           { 2, 14,  9, 11, 18},
127
         };
128
    }
129

    
130
///////////////////////////////////////////////////////////////////////////////////////////////////
131
// the quadruple ( corner1, corner2, face1, face2 ) defining an edge.
132
// In fact the 2 corners already define it, the faces only provide easy
133
// way to get to know the colors. Order: arbitrary. Face1 arbitrarily on
134
// the 'left' or right of vector corner1 --> corner2, according to Quat.
135

    
136
  void initializeEdgeMap()
137
    {
138
    mEdgeMap = new int[][]
139
         {
140
           {  0, 12,  0,  8}, //0
141
           { 12,  4,  0,  9},
142
           {  4, 14,  0,  4},
143
           { 14,  2,  0, 11},
144
           {  2,  0,  0,  1},
145
           { 14,  9, 11,  4}, //5
146
           {  9, 11, 11,  3},
147
           { 11, 18, 11,  2},
148
           { 18,  2, 11,  1},
149
           { 18,  6,  1,  2},
150
           {  6, 16,  1,  7}, //10
151
           { 16,  0,  1,  8},
152
           { 16, 10,  8,  7},
153
           { 10,  8,  8, 10},
154
           {  8, 12,  8,  9},
155
           {  8, 13,  9, 10}, //15
156
           { 13,  5,  9,  5},
157
           {  5,  4,  9,  4},
158
           {  5, 15,  4,  5},
159
           { 15,  9,  4,  3},
160
           { 11, 19,  2,  3}, //20
161
           { 19,  7,  2,  6},
162
           {  7,  6,  2,  7},
163
           {  7, 17,  7,  6},
164
           { 17, 10,  7, 10},
165
           { 17,  1, 10,  6}, //25
166
           {  1,  3,  5,  6},
167
           {  3, 19,  3,  6},
168
           {  1, 13, 10,  5},
169
           {  3, 15,  5,  3},
170
         };
171
    }
172

    
173
///////////////////////////////////////////////////////////////////////////////////////////////////
174

    
175
  void initializeQuatIndices()
176
    {
177
    mQuatEdgeIndices = new int[]
178
      {
179
        56, 40, 43, 59,  0, 19,  9, 54, 58, 49,
180
        48, 24, 52,  4, 16, 32, 20, 11, 21, 35,
181
        37, 30,  8, 28, 36, 44,  1, 46, 12, 47
182
      };
183
    mQuatCornerIndices = new int[]
184
      {
185
         0,  2,  3,  1, 40, 31, 41, 30, 39, 35,
186
        36, 34, 56, 32, 43, 21, 48, 28, 42, 23
187
      };
188
    }
189

    
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

    
192
  void initializeCornerFaceMap()
193
    {
194
    mCornerFaceMap = new int[][]
195
         {
196
           {  0, 1, 8 },
197
           {  6, 5,10 },
198
           {  1, 0,11 },
199
           {  5, 6, 3 },
200
           {  0, 9, 4 },
201
           {  5, 4, 9 },
202
           {  7, 1, 2 },
203
           {  2, 6, 7 },
204
           { 10, 9, 8 },
205
           {  4, 3,11 },
206
           {  7,10, 8 },
207
           {  3, 2,11 },
208
           {  0, 8, 9 },
209
           {  9,10, 5 },
210
           {  0, 4,11 },
211
           {  4, 5, 3 },
212
           {  1, 7, 8 },
213
           {  7, 6,10 },
214
           {  2, 1,11 },
215
           {  6, 2, 3 },
216
         };
217
    }
218

    
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

    
221
  void initializeQuats()
222
    {
223
    mQuats = new Static4D[]
224
         {
225
         new Static4D(  0.0f,  0.0f,  0.0f,  1.0f ),  //0
226
         new Static4D(  1.0f,  0.0f,  0.0f,  0.0f ),
227
         new Static4D(  0.0f,  1.0f,  0.0f,  0.0f ),
228
         new Static4D(  0.0f,  0.0f,  1.0f,  0.0f ),
229

    
230
         new Static4D(  0.5f,  0.5f,  0.5f,  0.5f ),  //4
231
         new Static4D(  0.5f,  0.5f, -0.5f,  0.5f ),
232
         new Static4D(  0.5f, -0.5f,  0.5f,  0.5f ),
233
         new Static4D(  0.5f, -0.5f, -0.5f,  0.5f ),
234
         new Static4D( -0.5f,  0.5f,  0.5f,  0.5f ),
235
         new Static4D( -0.5f,  0.5f, -0.5f,  0.5f ),
236
         new Static4D( -0.5f, -0.5f,  0.5f,  0.5f ),
237
         new Static4D( -0.5f, -0.5f, -0.5f,  0.5f ),
238

    
239
         new Static4D(  0.5f, SIN54, SIN18,  0.0f ), // 12
240
         new Static4D(  0.5f, SIN54,-SIN18,  0.0f ),
241
         new Static4D(  0.5f,-SIN54, SIN18,  0.0f ),
242
         new Static4D(  0.5f,-SIN54,-SIN18,  0.0f ),
243
         new Static4D( SIN18,  0.5f, SIN54,  0.0f ),
244
         new Static4D( SIN18,  0.5f,-SIN54,  0.0f ),
245
         new Static4D(-SIN18,  0.5f, SIN54,  0.0f ),
246
         new Static4D(-SIN18,  0.5f,-SIN54,  0.0f ),
247
         new Static4D( SIN54, SIN18,  0.5f,  0.0f ),
248
         new Static4D( SIN54,-SIN18,  0.5f,  0.0f ),
249
         new Static4D(-SIN54, SIN18,  0.5f,  0.0f ),
250
         new Static4D(-SIN54,-SIN18,  0.5f,  0.0f ),
251

    
252
         new Static4D(  0.0f, SIN18, SIN54,  0.5f ), //24
253
         new Static4D(  0.0f, SIN18,-SIN54,  0.5f ),
254
         new Static4D(  0.0f,-SIN18, SIN54,  0.5f ),
255
         new Static4D(  0.0f,-SIN18,-SIN54,  0.5f ),
256
         new Static4D( SIN18, SIN54,  0.0f,  0.5f ),
257
         new Static4D( SIN18,-SIN54,  0.0f,  0.5f ),
258
         new Static4D(-SIN18, SIN54,  0.0f,  0.5f ),
259
         new Static4D(-SIN18,-SIN54,  0.0f,  0.5f ),
260
         new Static4D( SIN54,  0.0f, SIN18,  0.5f ),
261
         new Static4D( SIN54,  0.0f,-SIN18,  0.5f ),
262
         new Static4D(-SIN54,  0.0f, SIN18,  0.5f ),
263
         new Static4D(-SIN54,  0.0f,-SIN18,  0.5f ),
264

    
265
         new Static4D(  0.0f, SIN54,  0.5f, SIN18 ), //36
266
         new Static4D(  0.0f, SIN54, -0.5f, SIN18 ),
267
         new Static4D(  0.0f,-SIN54,  0.5f, SIN18 ),
268
         new Static4D(  0.0f,-SIN54, -0.5f, SIN18 ),
269
         new Static4D(  0.5f,  0.0f, SIN54, SIN18 ),
270
         new Static4D(  0.5f,  0.0f,-SIN54, SIN18 ),
271
         new Static4D( -0.5f,  0.0f, SIN54, SIN18 ),
272
         new Static4D( -0.5f,  0.0f,-SIN54, SIN18 ),
273
         new Static4D( SIN54,  0.5f,  0.0f, SIN18 ),
274
         new Static4D( SIN54, -0.5f,  0.0f, SIN18 ),
275
         new Static4D(-SIN54,  0.5f,  0.0f, SIN18 ),
276
         new Static4D(-SIN54, -0.5f,  0.0f, SIN18 ),
277

    
278
         new Static4D(  0.0f,  0.5f, SIN18, SIN54 ), //48
279
         new Static4D(  0.0f,  0.5f,-SIN18, SIN54 ),
280
         new Static4D(  0.0f, -0.5f, SIN18, SIN54 ),
281
         new Static4D(  0.0f, -0.5f,-SIN18, SIN54 ),
282
         new Static4D(  0.5f, SIN18,  0.0f, SIN54 ),
283
         new Static4D(  0.5f,-SIN18,  0.0f, SIN54 ),
284
         new Static4D( -0.5f, SIN18,  0.0f, SIN54 ),
285
         new Static4D( -0.5f,-SIN18,  0.0f, SIN54 ),
286
         new Static4D( SIN18,  0.0f,  0.5f, SIN54 ),
287
         new Static4D( SIN18,  0.0f, -0.5f, SIN54 ),
288
         new Static4D(-SIN18,  0.0f,  0.5f, SIN54 ),
289
         new Static4D(-SIN18,  0.0f, -0.5f, SIN54 ),
290
         };
291
    }
292

    
293
///////////////////////////////////////////////////////////////////////////////////////////////////
294
// Coordinates of all 20 corners of a Minx
295

    
296
  void initializeCorners()
297
    {
298
    float cA = 1.5f;
299
    float cB = 3*C2;
300
    float cC = 3*SIN54;
301

    
302
    mCorners = new float[][]
303
         {
304
             {  0, cA, cB},
305
             {  0, cA,-cB},
306
             {  0,-cA, cB},
307
             {  0,-cA,-cB},
308
             { cB,  0, cA},
309
             { cB,  0,-cA},
310
             {-cB,  0, cA},
311
             {-cB,  0,-cA},
312
             { cA, cB,  0},
313
             { cA,-cB,  0},
314
             {-cA, cB,  0},
315
             {-cA,-cB,  0},
316
             { cC, cC, cC},
317
             { cC, cC,-cC},
318
             { cC,-cC, cC},
319
             { cC,-cC,-cC},
320
             {-cC, cC, cC},
321
             {-cC, cC,-cC},
322
             {-cC,-cC, cC},
323
             {-cC,-cC,-cC},
324
         };
325
    }
326

    
327
///////////////////////////////////////////////////////////////////////////////////////////////////
328

    
329
  void initializeCenterCoords()
330
    {
331
    if( mCorners==null ) initializeCorners();
332
    if( mCenterMap==null ) initializeCenterMap();
333

    
334
    mCenterCoords = new float[NUM_CENTERS][3];
335

    
336
    for(int center=0; center<NUM_CENTERS; center++)
337
      {
338
      int[] map = mCenterMap[center];
339

    
340
      float x = mCorners[map[0]][0] +
341
                mCorners[map[1]][0] +
342
                mCorners[map[2]][0] +
343
                mCorners[map[3]][0] +
344
                mCorners[map[4]][0] ;
345

    
346
      float y = mCorners[map[0]][1] +
347
                mCorners[map[1]][1] +
348
                mCorners[map[2]][1] +
349
                mCorners[map[3]][1] +
350
                mCorners[map[4]][1] ;
351

    
352
      float z = mCorners[map[0]][2] +
353
                mCorners[map[1]][2] +
354
                mCorners[map[2]][2] +
355
                mCorners[map[3]][2] +
356
                mCorners[map[4]][2] ;
357

    
358
      mCenterCoords[center][0] = x/5;
359
      mCenterCoords[center][1] = y/5;
360
      mCenterCoords[center][2] = z/5;
361
      }
362
    }
363

    
364
///////////////////////////////////////////////////////////////////////////////////////////////////
365

    
366
  private int[] generateL(int numLayers, int index)
367
    {
368
    int rows = (numLayers-1)/2;
369
    int[] ret = new int[3*4*rows];
370

    
371
    for(int i=0; i<rows; i++)
372
      {
373
      ret[12*i   ] = i;
374
      ret[12*i+ 1] =-2;
375
      ret[12*i+ 2] = index;
376
      ret[12*i+ 3] = i;
377
      ret[12*i+ 4] =-1;
378
      ret[12*i+ 5] = index;
379
      ret[12*i+ 6] = i;
380
      ret[12*i+ 7] =+1;
381
      ret[12*i+ 8] = index;
382
      ret[12*i+ 9] = i;
383
      ret[12*i+10] =+2;
384
      ret[12*i+11] = index;
385
      }
386

    
387
    return ret;
388
    }
389

    
390
///////////////////////////////////////////////////////////////////////////////////////////////////
391

    
392
  private int[] generateR(int numLayers, int index)
393
    {
394
    int rows = (numLayers-1)/2;
395
    int[] ret = new int[3*4*rows];
396

    
397
    for(int i=0; i<rows; i++)
398
      {
399
      int lay = rows+i+1;
400

    
401
      ret[12*i   ] = lay;
402
      ret[12*i+ 1] =-2;
403
      ret[12*i+ 2] = index;
404
      ret[12*i+ 3] = lay;
405
      ret[12*i+ 4] =-1;
406
      ret[12*i+ 5] = index;
407
      ret[12*i+ 6] = lay;
408
      ret[12*i+ 7] =+1;
409
      ret[12*i+ 8] = index;
410
      ret[12*i+ 9] = lay;
411
      ret[12*i+10] =+2;
412
      ret[12*i+11] = index;
413
      }
414

    
415
    return ret;
416
    }
417

    
418
///////////////////////////////////////////////////////////////////////////////////////////////////
419

    
420
  private int[] generateB(int numLayers, int index)
421
    {
422
    int rows = (numLayers-1);
423
    int half = rows/2;
424
    int[] ret = new int[3*4*rows];
425

    
426
    for(int i=0; i<rows; i++)
427
      {
428
      int ind = i<half? index : index+1;
429
      int lay = i<half? i : i+1;
430

    
431
      ret[12*i   ] = lay;
432
      ret[12*i+ 1] =-2;
433
      ret[12*i+ 2] = ind;
434
      ret[12*i+ 3] = lay;
435
      ret[12*i+ 4] =-1;
436
      ret[12*i+ 5] = ind;
437
      ret[12*i+ 6] = lay;
438
      ret[12*i+ 7] =+1;
439
      ret[12*i+ 8] = ind;
440
      ret[12*i+ 9] = lay;
441
      ret[12*i+10] =+2;
442
      ret[12*i+11] = ind;
443
      }
444

    
445
    return ret;
446
    }
447

    
448
///////////////////////////////////////////////////////////////////////////////////////////////////
449

    
450
  private void initializeScrambleStates(int numLayers)
451
    {
452
    int[] LEFT0 = generateL(numLayers,1);
453
    int[] RIGH0 = generateR(numLayers,2);
454
    int[] LEFT1 = generateL(numLayers,3);
455
    int[] RIGH1 = generateR(numLayers,4);
456
    int[] LEFT2 = generateL(numLayers,5);
457
    int[] RIGH2 = generateR(numLayers,6);
458
    int[] LEFT3 = generateL(numLayers,7);
459
    int[] RIGH3 = generateR(numLayers,8);
460
    int[] LEFT4 = generateL(numLayers,9);
461
    int[] RIGH4 = generateR(numLayers,10);
462
    int[] LEFT5 = generateL(numLayers,11);
463
    int[] RIGH5 = generateR(numLayers,12);
464

    
465
    int[] BOTH1 = generateB(numLayers,1);
466
    int[] BOTH3 = generateB(numLayers,3);
467
    int[] BOTH5 = generateB(numLayers,5);
468
    int[] BOTH7 = generateB(numLayers,7);
469
    int[] BOTH9 = generateB(numLayers,9);
470
    int[] BOTH11= generateB(numLayers,11);
471

    
472
    mStates = new ScrambleState[]
473
      {
474
      new ScrambleState( new int[][] { BOTH1,BOTH3,BOTH5,BOTH7,BOTH9,BOTH11 } ), // beg
475
      new ScrambleState( new int[][] { {}   ,RIGH1,LEFT2,RIGH3,LEFT4,LEFT5  } ), // 0L
476
      new ScrambleState( new int[][] { {}   ,LEFT1,RIGH2,LEFT3,RIGH4,RIGH5  } ), // 0R
477
      new ScrambleState( new int[][] { RIGH0,{}   ,LEFT2,RIGH3,RIGH4,RIGH5  } ), // 1L
478
      new ScrambleState( new int[][] { LEFT0,{}   ,RIGH2,LEFT3,LEFT4,LEFT5  } ), // 1R
479
      new ScrambleState( new int[][] { LEFT0,LEFT1,{}   ,RIGH3,LEFT4,RIGH5  } ), // 2L
480
      new ScrambleState( new int[][] { RIGH0,RIGH1,{}   ,LEFT3,RIGH4,LEFT5  } ), // 2R
481
      new ScrambleState( new int[][] { RIGH0,RIGH1,RIGH2,{}   ,LEFT4,RIGH5  } ), // 3L
482
      new ScrambleState( new int[][] { LEFT0,LEFT1,LEFT2,{}   ,RIGH4,LEFT5  } ), // 3R
483
      new ScrambleState( new int[][] { LEFT0,RIGH1,LEFT2,LEFT3,{}   ,RIGH5  } ), // 4L
484
      new ScrambleState( new int[][] { RIGH0,LEFT1,RIGH2,RIGH3,{}   ,LEFT5  } ), // 4R
485
      new ScrambleState( new int[][] { LEFT0,RIGH1,RIGH2,RIGH3,RIGH4,{}     } ), // 5L
486
      new ScrambleState( new int[][] { RIGH0,LEFT1,LEFT2,LEFT3,LEFT4,{}     } ), // 5R
487
      };
488
    }
489

    
490
///////////////////////////////////////////////////////////////////////////////////////////////////
491

    
492
  int[] getSolvedQuats(int cubit, int numLayers)
493
    {
494
    if( mQuats==null ) initializeQuats();
495
    if( mFaceMap==null ) mFaceMap = new int[] {8,10,3,7,1,11,9,2,4,0,5,6};
496
    int status = retCubitSolvedStatus(cubit,numLayers);
497
    return status<0 ? null : buildSolvedQuats(MovementMinx.FACE_AXIS[mFaceMap[status]],mQuats);
498
    }
499

    
500
///////////////////////////////////////////////////////////////////////////////////////////////////
501

    
502
  Static4D[] getQuats()
503
    {
504
    if( mQuats==null ) initializeQuats();
505
    return mQuats;
506
    }
507

    
508
///////////////////////////////////////////////////////////////////////////////////////////////////
509

    
510
  int getSolvedFunctionIndex()
511
    {
512
    return 0;
513
    }
514

    
515
///////////////////////////////////////////////////////////////////////////////////////////////////
516

    
517
  int getNumCubitFaces()
518
    {
519
    return 6;
520
    }
521

    
522
///////////////////////////////////////////////////////////////////////////////////////////////////
523
// PUBLIC API
524

    
525
  public Static3D[] getRotationAxis()
526
    {
527
    return ROT_AXIS;
528
    }
529

    
530
///////////////////////////////////////////////////////////////////////////////////////////////////
531

    
532
  public Movement getMovement()
533
    {
534
    if( mMovement==null ) mMovement = new MovementMinx();
535
    return mMovement;
536
    }
537

    
538
///////////////////////////////////////////////////////////////////////////////////////////////////
539

    
540
  public int[] getBasicAngle()
541
    {
542
    if( mBasicAngle ==null ) mBasicAngle = new int[] { 5,5,5,5,5,5 };
543
    return mBasicAngle;
544
    }
545
}
(37-37/48)