Project

General

Profile

Download (13.9 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistyJing.java @ d8e03a81

1 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2021 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.objectlib.objects;
21
22 c9c71c3f Leszek Koltunski
import static org.distorted.objectlib.touchcontrol.TouchControl.TC_TETRAHEDRON;
23
import static org.distorted.objectlib.touchcontrol.TouchControl.TYPE_NOT_SPLIT;
24 29b82486 Leszek Koltunski
25 82eb152a Leszek Koltunski
import java.io.InputStream;
26 29b82486 Leszek Koltunski
27
import org.distorted.library.type.Static3D;
28
import org.distorted.library.type.Static4D;
29
30 3ee1d662 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectFaceShape;
31 c9c71c3f Leszek Koltunski
import org.distorted.objectlib.touchcontrol.TouchControlTetrahedron;
32 8005e762 Leszek Koltunski
import org.distorted.objectlib.main.ObjectType;
33 198c5bf0 Leszek Koltunski
import org.distorted.objectlib.helpers.ObjectShape;
34 10b7e306 Leszek Koltunski
import org.distorted.objectlib.scrambling.ScrambleState;
35 386af988 Leszek Koltunski
import org.distorted.objectlib.main.ShapeTetrahedron;
36 29b82486 Leszek Koltunski
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38
39 386af988 Leszek Koltunski
public class TwistyJing extends ShapeTetrahedron
40 29b82486 Leszek Koltunski
{
41
  static final Static3D[] ROT_AXIS = new Static3D[]
42
         {
43
           new Static3D(     0,-SQ3/3,-SQ6/3),
44
           new Static3D(     0,-SQ3/3,+SQ6/3),
45
           new Static3D(+SQ6/3,+SQ3/3,     0),
46
           new Static3D(-SQ6/3,+SQ3/3,     0),
47
         };
48
49
  static final float F = 0.48f;  // length of the edge of the corner cubit. Keep<0.5
50
                                 // Assuming the length of the edge of the whole
51 d53fb890 Leszek Koltunski
                                 // tetrahedron is 2.0 (ie standard, equal to numLayers)
52 29b82486 Leszek Koltunski
53
  private ScrambleState[] mStates;
54 beee90ab Leszek Koltunski
  private int[][] mBasicAngle;
55 e7587264 Leszek Koltunski
  private int[] mQuatIndex;
56 29b82486 Leszek Koltunski
  private float[][] mCuts;
57
  private float[][] mCenters;
58
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60
61 3bf19410 Leszek Koltunski
  public TwistyJing(int[] numL, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
62 29b82486 Leszek Koltunski
    {
63 3bf19410 Leszek Koltunski
    super(numL, meshState, iconMode, numL[0], quat, move, scale, stream);
64 29b82486 Leszek Koltunski
    }
65
66
///////////////////////////////////////////////////////////////////////////////////////////////////
67
68 f9a81f52 Leszek Koltunski
  public ScrambleState[] getScrambleStates()
69 29b82486 Leszek Koltunski
    {
70
    if( mStates==null )
71
      {
72
      int[] tmp = {0,-1,0, 0,1,0, 1,-1,0, 1,1,0 };
73
74
      mStates = new ScrambleState[]
75
        {
76
        new ScrambleState( new int[][] {tmp,tmp,tmp,tmp} )
77
        };
78
      }
79
80
    return mStates;
81
    }
82
83
///////////////////////////////////////////////////////////////////////////////////////////////////
84
85 7bbfc84f Leszek Koltunski
  public float[][] getCuts(int[] numLayers)
86 29b82486 Leszek Koltunski
    {
87
    if( mCuts==null )
88
      {
89
      float[] cut = { (F-0.5f)*(SQ6/3) };
90
      mCuts = new float[][] { cut,cut,cut,cut };
91
      }
92
93
    return mCuts;
94
    }
95
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97
98 59c20632 Leszek Koltunski
  public boolean[][] getLayerRotatable(int[] numLayers)
99 29b82486 Leszek Koltunski
    {
100 9b1fe915 Leszek Koltunski
    boolean[] tmp = {true,true};
101
    return new boolean[][] { tmp,tmp,tmp,tmp };
102 59c20632 Leszek Koltunski
    }
103
104
///////////////////////////////////////////////////////////////////////////////////////////////////
105
106 11fa413d Leszek Koltunski
  public int getTouchControlType()
107 59c20632 Leszek Koltunski
    {
108 c9c71c3f Leszek Koltunski
    return TC_TETRAHEDRON;
109 59c20632 Leszek Koltunski
    }
110
111
///////////////////////////////////////////////////////////////////////////////////////////////////
112
113 11fa413d Leszek Koltunski
  public int getTouchControlSplit()
114 59c20632 Leszek Koltunski
    {
115
    return TYPE_NOT_SPLIT;
116
    }
117
118
///////////////////////////////////////////////////////////////////////////////////////////////////
119
120
  public int[][][] getEnabled()
121
    {
122 1b7ece90 Leszek Koltunski
    return new int[][][] { {{1,2,3}},{{0,2,3}},{{0,1,3}},{{0,1,2}} };
123 59c20632 Leszek Koltunski
    }
124
125
///////////////////////////////////////////////////////////////////////////////////////////////////
126
127
  public float[] getDist3D(int[] numLayers)
128
    {
129 4c9ca251 Leszek Koltunski
    return TouchControlTetrahedron.D3D;
130
    }
131
132
///////////////////////////////////////////////////////////////////////////////////////////////////
133
134
  public Static3D[] getFaceAxis()
135
    {
136
    return TouchControlTetrahedron.FACE_AXIS;
137 29b82486 Leszek Koltunski
    }
138
139 d0e6cf7f Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
140
141
  public float[][] getCubitPositions(int[] numLayers)
142
    {
143
    if( mCenters==null )
144
      {
145
      mCenters = new float[][]
146
         {
147
           { 0.000f, -SQ2/2, 1.000f },
148
           { 0.000f, -SQ2/2,-1.000f },
149
           {-1.000f,  SQ2/2, 0.000f },
150
           { 1.000f,  SQ2/2, 0.000f },
151
152
           { 0.000f, -SQ2/2, 0.000f },
153
           {-0.500f, 0.000f, 0.500f },
154
           { 0.500f, 0.000f, 0.500f },
155
           {-0.500f, 0.000f,-0.500f },
156
           { 0.500f, 0.000f,-0.500f },
157
           { 0.000f,  SQ2/2, 0.000f },
158
159
           { 0.000f,  SQ2/6, 1.0f/3 },
160
           { 0.000f,  SQ2/6,-1.0f/3 },
161
           {-1.0f/3, -SQ2/6, 0.000f },
162
           { 1.0f/3, -SQ2/6, 0.000f },
163
         };
164
      }
165
166
    return mCenters;
167
    }
168
169
///////////////////////////////////////////////////////////////////////////////////////////////////
170
171
  public Static4D getCubitQuats(int cubit, int[] numLayers)
172
    {
173 a4af26c1 Leszek Koltunski
    if( mQuatIndex==null ) mQuatIndex = new int[] {0,10,5,8,
174
                                                   0,5,8,6,7,9,
175
                                                   0,10,7,3};
176 e7587264 Leszek Koltunski
    return mObjectQuats[mQuatIndex[cubit]];
177 d0e6cf7f Leszek Koltunski
    }
178
179 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
180
181 e30c522a Leszek Koltunski
  public ObjectShape getObjectShape(int variant)
182 29b82486 Leszek Koltunski
    {
183
    final float X = F/2;
184
    final float Y = F*SQ2/2;
185
    final float Z =-F/2;
186
    final float L = (2.0f-3*F);
187
    final float X2= L/2;
188
    final float Y2= L*SQ2/2;
189
    final float Z2=-L/2;
190
    final float D = F/L;
191
    final float G = 1.0f-F;
192
193
    if( variant==0 )
194
      {
195 4e9f2df5 Leszek Koltunski
      float[][] vertices =
196 29b82486 Leszek Koltunski
          {
197 57ef6378 Leszek Koltunski
             {   0,   0,   0 },
198 29b82486 Leszek Koltunski
             {   X,   Y,   Z },
199 57ef6378 Leszek Koltunski
             {   0, 2*Y, 2*Z },
200 29b82486 Leszek Koltunski
             {  -X,   Y,   Z },
201 57ef6378 Leszek Koltunski
             {   0,   0,    -F },
202 29b82486 Leszek Koltunski
             {   X,   Y,   Z-F },
203 57ef6378 Leszek Koltunski
             {   0, 2*Y, 2*Z-F },
204 29b82486 Leszek Koltunski
             {  -X,   Y,   Z-F },
205
          };
206 4e9f2df5 Leszek Koltunski
      int[][] indices =
207 29b82486 Leszek Koltunski
          {
208
             {0,1,2,3},
209
             {1,0,4,5},
210
             {7,4,0,3},
211
             {1,5,6,2},
212
             {7,3,2,6},
213
             {4,7,6,5}
214
          };
215
216 59a971c1 Leszek Koltunski
      return new ObjectShape(vertices, indices);
217 29b82486 Leszek Koltunski
      }
218
    else if( variant==1 )
219
      {
220 4e9f2df5 Leszek Koltunski
      float[][] vertices =
221 29b82486 Leszek Koltunski
          {
222 57ef6378 Leszek Koltunski
             {   0,   0,     G },
223 29b82486 Leszek Koltunski
             {   X,   Y,   Z+G },
224 57ef6378 Leszek Koltunski
             {   0, 2*Y, 2*Z+G },
225 29b82486 Leszek Koltunski
             {  -X,   Y,   Z+G },
226 57ef6378 Leszek Koltunski
             {   0,   0,    -G },
227 29b82486 Leszek Koltunski
             {   X,   Y,  -Z-G },
228 57ef6378 Leszek Koltunski
             {   0, 2*Y,-2*Z-G },
229 29b82486 Leszek Koltunski
             {  -X,   Y,  -Z-G },
230
          };
231 4e9f2df5 Leszek Koltunski
      int[][] indices =
232 29b82486 Leszek Koltunski
          {
233
             {0,4,5,1},
234
             {3,7,4,0},
235
             {0,1,2,3},
236
             {4,7,6,5},
237
             {1,5,6,2},
238
             {2,6,7,3}
239
          };
240
241 59a971c1 Leszek Koltunski
      return new ObjectShape(vertices, indices);
242 29b82486 Leszek Koltunski
      }
243
    else
244
      {
245 4e9f2df5 Leszek Koltunski
      float[][] vertices =
246 29b82486 Leszek Koltunski
          {
247 57ef6378 Leszek Koltunski
             {        0,   -2*Y2/3,       -2*Z2/3 },
248
             {       X2,      Y2/3,          Z2/3 },
249
             {      -X2,      Y2/3,          Z2/3 },
250
             {        0,   -2*Y2/3,-2*Z2/3+2*D*Z2 },
251
             {  X2-D*X2, Y2/3-D*Y2,     Z2/3+D*Z2 },
252
             { -X2+D*X2, Y2/3-D*Y2,     Z2/3+D*Z2 },
253 29b82486 Leszek Koltunski
          };
254 4e9f2df5 Leszek Koltunski
      int[][] indices =
255 29b82486 Leszek Koltunski
          {
256
             {0,1,2},
257
             {3,5,4},
258
             {0,3,4,1},
259
             {5,3,0,2},
260
             {4,5,2,1}
261
          };
262
263 59a971c1 Leszek Koltunski
      return new ObjectShape(vertices, indices);
264 3ee1d662 Leszek Koltunski
      }
265
    }
266
267
///////////////////////////////////////////////////////////////////////////////////////////////////
268
269
  public ObjectFaceShape getObjectFaceShape(int variant)
270
    {
271
    final float Y = F*SQ2/2;
272
    final float Z =-F/2;
273
    final float L = (2.0f-3*F);
274
275
    if( variant==0 )
276
      {
277 3bf19410 Leszek Koltunski
      float height = isInIconMode() ? 0.001f : 0.015f;
278
      float[][] bands     = { {height,35,0.25f*F,0.5f*F,5,1,1},{0.001f,35,0.25f*F,0.5f*F,5,1,1} };
279 4e9f2df5 Leszek Koltunski
      int[] bandIndices   = { 0,0,0,1,1,1 };
280
      float[][] corners   = { {0.08f,0.20f*F},{0.07f,0.20f*F} };
281
      int[] cornerIndices = { 0,1,1,-1,1,-1,-1,-1 };
282
      float[][] centers   = { { 0.0f, Y, Z-F/2} };
283
      int[] centerIndices = { 0,0,0,-1,0,-1,-1,-1 };
284 3ee1d662 Leszek Koltunski
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
285
      }
286
    else if( variant==1 )
287
      {
288 3bf19410 Leszek Koltunski
      float height = isInIconMode() ? 0.001f : 0.015f;
289
      float[][] bands     = { {height,35,0.5f*F,F,5,1,1},{0.001f,35,0.5f*F,F,5,1,1} };
290 4e9f2df5 Leszek Koltunski
      int[] bandIndices   = { 0,0,1,1,1,1 };
291
      float[][] corners   = { {0.07f,0.20f*F} };
292
      int[] cornerIndices = { 0,0,-1,0,0,0,-1,0 };
293
      float[][] centers   = { { 0, F*SQ2/2, 0 } };
294
      int[] centerIndices = { 0,0,-1,0,0,0,-1,0 };
295 3ee1d662 Leszek Koltunski
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
296
      }
297
    else
298
      {
299 3bf19410 Leszek Koltunski
      float height = isInIconMode() ? 0.001f : 0.020f;
300
      float[][] bands     = { {height,35,0.20f*L,0.6f*L,5,1,1}, {0.001f,35,0.05f*L,0.1f*L,5,1,1} };
301 4e9f2df5 Leszek Koltunski
      int[] bandIndices   = { 0,1,1,1,1,1 };
302
      float[][] corners   = { {0.04f,0.6f*F} };
303
      int[] cornerIndices = { 0,0,0,-1,-1,-1 };
304
      float[][] centers   = { { 0, -2*Y/3, 4*Z/3 } };
305
      int[] centerIndices = { 0,0,0,-1,-1,-1 };
306 3ee1d662 Leszek Koltunski
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
307 29b82486 Leszek Koltunski
      }
308
    }
309
310
///////////////////////////////////////////////////////////////////////////////////////////////////
311
312 e30c522a Leszek Koltunski
  public int getNumCubitVariants(int[] numLayers)
313 29b82486 Leszek Koltunski
    {
314
    return 3;
315
    }
316
317
///////////////////////////////////////////////////////////////////////////////////////////////////
318
319 e30c522a Leszek Koltunski
  public int getCubitVariant(int cubit, int[] numLayers)
320 29b82486 Leszek Koltunski
    {
321
    return cubit<4 ? 0 : (cubit<10?1:2);
322
    }
323
324 00f4980d Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
325
326 d53fb890 Leszek Koltunski
  public float getStickerRadius()
327 00f4980d Leszek Koltunski
    {
328
    return 0.04f;
329
    }
330
331
///////////////////////////////////////////////////////////////////////////////////////////////////
332
333 d53fb890 Leszek Koltunski
  public float getStickerStroke()
334 00f4980d Leszek Koltunski
    {
335 3bf19410 Leszek Koltunski
    return isInIconMode() ? 0.08f : 0.04f;
336 00f4980d Leszek Koltunski
    }
337
338
///////////////////////////////////////////////////////////////////////////////////////////////////
339
340 d53fb890 Leszek Koltunski
  public float[][] getStickerAngles()
341 00f4980d Leszek Koltunski
    {
342
    return null;
343
    }
344
345 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
346
// PUBLIC API
347
348
  public Static3D[] getRotationAxis()
349
    {
350
    return ROT_AXIS;
351
    }
352
353
///////////////////////////////////////////////////////////////////////////////////////////////////
354
355 beee90ab Leszek Koltunski
  public int[][] getBasicAngles()
356 29b82486 Leszek Koltunski
    {
357 beee90ab Leszek Koltunski
    if( mBasicAngle ==null )
358
      {
359
      int num = getNumLayers()[0];
360
      int[] tmp = new int[num];
361
      for(int i=0; i<num; i++) tmp[i] = 3;
362
      mBasicAngle = new int[][] { tmp,tmp,tmp,tmp };
363
      }
364
365 29b82486 Leszek Koltunski
    return mBasicAngle;
366
    }
367
368 61aa85e4 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
369
370 5f54927b Leszek Koltunski
  public String getShortName()
371 61aa85e4 Leszek Koltunski
    {
372 5f54927b Leszek Koltunski
    return ObjectType.JING_2.name();
373
    }
374
375
///////////////////////////////////////////////////////////////////////////////////////////////////
376
377
  public long getSignature()
378
    {
379
    return ObjectType.JING_2.ordinal();
380 61aa85e4 Leszek Koltunski
    }
381
382 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
383
384 e26eb4e7 Leszek Koltunski
  public String getObjectName()
385 29b82486 Leszek Koltunski
    {
386 e26eb4e7 Leszek Koltunski
    return "Jing Pyraminx";
387 29b82486 Leszek Koltunski
    }
388
389
///////////////////////////////////////////////////////////////////////////////////////////////////
390
391 e26eb4e7 Leszek Koltunski
  public String getInventor()
392 29b82486 Leszek Koltunski
    {
393 e26eb4e7 Leszek Koltunski
    return "Tony Fisher";
394 29b82486 Leszek Koltunski
    }
395
396 59c20632 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
397
398 e26eb4e7 Leszek Koltunski
  public int getYearOfInvention()
399 59c20632 Leszek Koltunski
    {
400
    return 1991;
401
    }
402
403 29b82486 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
404
405 e26eb4e7 Leszek Koltunski
  public int getComplexity()
406 29b82486 Leszek Koltunski
    {
407 b4223a92 Leszek Koltunski
    return 1;
408 29b82486 Leszek Koltunski
    }
409 052e0362 Leszek Koltunski
410
///////////////////////////////////////////////////////////////////////////////////////////////////
411
412
  public String[][] getTutorials()
413
    {
414
    return new String[][]{
415
                          {"gb","0T8Iw6aI2gA","Jing's Pyraminx Tutorial","SuperAntoniovivaldi"},
416
                          {"es","Na27_GUIzqY","Resolver Jing Pyraminx","Cuby"},
417
                          {"ru","rlQXFzjsyAo","Как собрать Jing's pyraminx","Илья Топор-Гилка"},
418
                          {"fr","zC9dGqZRSic","Résolution du Jing's Pyraminx","Asthalis"},
419
                          {"de","6ihN4fdHH6o","Jings Pyraminx - Tutorial","GerCubing"},
420 a399e91b Leszek Koltunski
                          {"pl","nRYoJAy1c_8","Jing's Pyraminx TUTORIAL PL","MrUK"},
421
                          {"vn","yX9KjDpHjws","Tutorial N.50 - Jing's Pyraminx","Duy Thích Rubik"},
422 052e0362 Leszek Koltunski
                         };
423
    }
424 29b82486 Leszek Koltunski
}