Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / objects / TwistySquare2.java @ 3bf19410

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
import java.io.InputStream;
23

    
24
import org.distorted.library.type.Static3D;
25
import org.distorted.library.type.Static4D;
26

    
27
import org.distorted.objectlib.helpers.ObjectFaceShape;
28
import org.distorted.objectlib.main.ObjectType;
29
import org.distorted.objectlib.helpers.ObjectShape;
30
import org.distorted.objectlib.scrambling.ScrambleState;
31

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

    
34
public class TwistySquare2 extends TwistySquare
35
{
36
  private ScrambleState[] mStates;
37
  private int[] mQuatNumber;
38
  private float[][] mCenters;
39

    
40
///////////////////////////////////////////////////////////////////////////////////////////////////
41

    
42
  public TwistySquare2(int[] numL, int meshState, int iconMode, Static4D quat, Static3D move, float scale, InputStream stream)
43
    {
44
    super(numL, meshState, iconMode, quat, move, scale, stream);
45
    }
46

    
47
///////////////////////////////////////////////////////////////////////////////////////////////////
48

    
49
  @Override
50
  public int[][] getSolvedQuats()
51
    {
52
    return new int[][]
53
      {
54
        { 2, 0,1 },                                   // 2 middle cubits in the first group
55
        {12, 2,4,6,8,10,12,14,16,19,21,23,25,  17 },  // 12 front and back edges and corners in the second group with quat[17]
56
        {12, 3,5,7,9,11,13,15,17,18,20,22,24,  23 }   // 12 left and right edges and corners in the third group with quat[23]
57
      };
58
    }
59

    
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61

    
62
  public ScrambleState[] getScrambleStates()
63
    {
64
    if( mStates==null )
65
      {
66
      int[] SL_6 = new int[] { 0,1,1, 1,1,1, 0,1,1, 1,1,1, 0,1,1, 1,1,1, 0,1,1, 1,1,1, 0,1,1, 1,1,1, 0,1,1, 1,1,1};
67
      int[] SL_1 = new int[] { 0,1,1, 1,1,1 };
68
      int[] LO_2 = new int[] { 0,-5,2, 0,-4,2, 0,-3,2, 0,-2,2, 0,-1,2, 0,1,2, 0,2,2, 0,3,2, 0,4,2, 0,5,2, 0,5,2 };
69
      int[] LO_3 = new int[] { 0,-5,3, 0,-4,3, 0,-3,3, 0,-2,3, 0,-1,3, 0,1,3, 0,2,3, 0,3,3, 0,4,3, 0,5,3, 0,5,3 };
70
      int[] LO_4 = new int[] { 0,-5,4, 0,-4,4, 0,-3,4, 0,-2,4, 0,-1,4, 0,1,4, 0,2,4, 0,3,4, 0,4,4, 0,5,4, 0,5,4 };
71

    
72
      mStates = new ScrambleState[]
73
        {
74
        new ScrambleState( new int[][] { LO_2, SL_6, LO_3 } ),  // 0
75
        new ScrambleState( new int[][] { LO_2, null, LO_3 } ),  // SL
76
        new ScrambleState( new int[][] { null, SL_1, LO_4 } ),  // LO
77
        new ScrambleState( new int[][] { LO_4, SL_1, null } ),  // UP
78
        new ScrambleState( new int[][] { null, SL_1, null } ),  // UL
79
        };
80
      }
81

    
82
    return mStates;
83
    }
84

    
85
///////////////////////////////////////////////////////////////////////////////////////////////////
86

    
87
  public float[][] getCubitPositions(int[] numLayers)
88
    {
89
    if( mCenters ==null )
90
      {
91
      float Y = 0.75f + X/2;
92

    
93
      mCenters = new float[][]
94
        {
95
         { 1.5f, 0.0f, 0.0f }, // 0
96
         {-1.5f, 0.0f, 0.0f },
97

    
98
         { 0.0f, 1.0f, 1.5f }, // 2
99
         { 1.5f, 1.0f, 0.0f },
100
         { 0.0f, 1.0f,-1.5f },
101
         {-1.5f, 1.0f, 0.0f },
102
         { 0.0f,-1.0f, 1.5f },
103
         { 1.5f,-1.0f, 0.0f },
104
         { 0.0f,-1.0f,-1.5f },
105
         {-1.5f,-1.0f, 0.0f },
106

    
107
         {    Y, 1.0f, 1.5f }, // 10
108
         { 1.5f, 1.0f,   -Y },
109
         {   -Y, 1.0f,-1.5f },
110
         {-1.5f, 1.0f,    Y },
111
         {    Y,-1.0f, 1.5f },
112
         { 1.5f,-1.0f,   -Y },
113
         {   -Y,-1.0f,-1.5f },
114
         {-1.5f,-1.0f,    Y },
115

    
116
         { 1.5f, 1.0f,    Y }, // 18
117
         {    Y, 1.0f,-1.5f },
118
         {-1.5f, 1.0f,   -Y },
119
         {   -Y, 1.0f, 1.5f },
120
         { 1.5f,-1.0f,    Y },
121
         {    Y,-1.0f,-1.5f },
122
         {-1.5f,-1.0f,   -Y },
123
         {   -Y,-1.0f, 1.5f },
124
        };
125
      }
126

    
127
    return mCenters;
128
    }
129

    
130
///////////////////////////////////////////////////////////////////////////////////////////////////
131

    
132
  public Static4D getCubitQuats(int cubit, int[] numLayers)
133
    {
134
    if( mQuatNumber ==null )
135
      {
136
      mQuatNumber = new int[]
137
        {
138
        0, 6,
139
        0, 9, 6, 3, 17, 14, 23, 20,
140
        0, 9, 6, 3, 0, 9, 6, 3,
141
        14, 23, 20, 17, 14, 23, 20, 17
142
        };
143
      }
144

    
145
    return mObjectQuats[mQuatNumber[cubit]];
146
    }
147

    
148
///////////////////////////////////////////////////////////////////////////////////////////////////
149

    
150
  public ObjectShape getObjectShape(int variant)
151
    {
152
    if( variant==0 )
153
      {
154
      float[][] vertices =
155
        {
156
         { -1.5f-X, 0.5f, 1.5f },
157
         {    0.0f, 0.5f, 1.5f },
158
         {    0.0f, 0.5f,-1.5f },
159
         { -1.5f+X, 0.5f,-1.5f },
160
         { -1.5f-X,-0.5f, 1.5f },
161
         {    0.0f,-0.5f, 1.5f },
162
         {    0.0f,-0.5f,-1.5f },
163
         { -1.5f+X,-0.5f,-1.5f }
164
        };
165

    
166
      int[][] indices =
167
        {
168
         {4,5,1,0},
169
         {5,6,2,1},
170
         {6,7,3,2},
171
         {7,4,0,3},
172
         {0,1,2,3},
173
         {7,6,5,4}
174
        };
175

    
176
      return new ObjectShape(vertices, indices);
177
      }
178
    else if( variant==1 )
179
      {
180
      float[][] vertices =
181
        {
182
         {  -X, 0.5f, 0.0f },
183
         {  +X, 0.5f, 0.0f },
184
         {0.0f, 0.5f,-1.5f },
185
         {  -X,-0.5f, 0.0f },
186
         {  +X,-0.5f, 0.0f },
187
         {0.0f,-0.5f,-1.5f },
188
        };
189

    
190
      int[][] indices =
191
        {
192
         {0,1,2},
193
         {3,4,1,0},
194
         {5,4,3},
195
         {4,5,2,1},
196
         {5,3,0,2}
197
        };
198

    
199
      return new ObjectShape(vertices, indices);
200
      }
201
    else
202
      {
203
      float[][] vertices =
204
        {
205
         {-0.75f+X/2, 0.5f,  0.0f },
206
         { 0.75f-X/2, 0.5f,  0.0f },
207
         {-0.75f-X/2, 0.5f, -1.5f },
208
         {-0.75f+X/2,-0.5f,  0.0f },
209
         { 0.75f-X/2,-0.5f,  0.0f },
210
         {-0.75f-X/2,-0.5f, -1.5f }
211
        };
212
      int[][] indices =
213
        {
214
         {0,1,2},
215
         {3,4,1,0},
216
         {5,4,3},
217
         {4,5,2,1},
218
         {5,3,0,2}
219
        };
220

    
221
      return new ObjectShape(vertices, indices);
222
      }
223
    }
224

    
225
///////////////////////////////////////////////////////////////////////////////////////////////////
226

    
227
  public ObjectFaceShape getObjectFaceShape(int variant)
228
    {
229
    if( variant==0 )
230
      {
231
      float h1 = isInIconMode() ? 0.001f : 0.04f;
232
      float h2 = isInIconMode() ? 0.001f : 0.02f;
233
      float[][] bands     = { {h1,35,0.2f,0.8f,5,2,1}, {h2,35,0.5f,1.0f,5,2,1}, {0.001f,35,0.3f,0.8f,5,2,1} };
234
      int[] bandIndices   = { 0,0,1,2,2,2 };
235
      float[][] corners   = { {0.03f,0.05f} };
236
      int[] cornerIndices = { 0,0,0,0,0,0,0,0 };
237
      float[][] centers   = { { -0.75f, 0.0f, 0.0f} };
238
      int[] centerIndices = { 0,0,0,0,0,0,0,0 };
239
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
240
      }
241
    else if( variant==1 )
242
      {
243
      float h1 = isInIconMode() ? 0.001f : 0.038f;
244
      float[][] bands     = { {h1,35,0.5f,0.9f, 5,2,1}, {0.001f,35,0.5f,0.9f, 5,2,1} };
245
      int[] bandIndices   = { 0,0,0,1,1 };
246
      float[][] corners   = { {0.04f,0.15f} };
247
      int[] cornerIndices = { 0,0,-1,0,0,-1 };
248
      float[][] centers   = { { 0.0f, 0.0f,-0.5f} };
249
      int[] centerIndices = { 0,0,-1,0,0,-1 };
250
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
251
      }
252
    else
253
      {
254
      float h1 = isInIconMode() ? 0.001f : 0.03f;
255
      float[][] bands     = { {h1,35,0.9f,1.0f, 5,2,1}, {0.001f,35,0.9f,1.0f, 5,2,1} };
256
      int[] bandIndices   = { 0,0,0,1,1 };
257
      float[][] corners   = { {0.05f,0.13f} };
258
      int[] cornerIndices = { 0,0,-1,0,0,-1 };
259
      float[][] centers   = { { 0.0f, 0.0f,-0.5f} };
260
      int[] centerIndices = { 0,0,-1,0,0,-1 };
261
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
262
      }
263
    }
264

    
265
///////////////////////////////////////////////////////////////////////////////////////////////////
266

    
267
  public int getNumCubitVariants(int[] numLayers)
268
    {
269
    return 3;
270
    }
271

    
272
///////////////////////////////////////////////////////////////////////////////////////////////////
273

    
274
  public int getCubitVariant(int cubit, int[] numLayers)
275
    {
276
    return cubit<2 ? 0 : (cubit<10 ? 1:2);
277
    }
278

    
279
///////////////////////////////////////////////////////////////////////////////////////////////////
280

    
281
  public float getStickerRadius()
282
    {
283
    return 0.12f;
284
    }
285

    
286
///////////////////////////////////////////////////////////////////////////////////////////////////
287

    
288
  public float getStickerStroke()
289
    {
290
    return isInIconMode() ? 0.20f : 0.10f;
291
    }
292

    
293
///////////////////////////////////////////////////////////////////////////////////////////////////
294

    
295
  public float[][] getStickerAngles()
296
    {
297
    return null;
298
    }
299

    
300
///////////////////////////////////////////////////////////////////////////////////////////////////
301
// PUBLIC API
302

    
303
  public String getShortName()
304
    {
305
    return ObjectType.SQU2_3.name();
306
    }
307

    
308
///////////////////////////////////////////////////////////////////////////////////////////////////
309

    
310
  public long getSignature()
311
    {
312
    return ObjectType.SQU2_3.ordinal();
313
    }
314

    
315
///////////////////////////////////////////////////////////////////////////////////////////////////
316

    
317
  public String getObjectName()
318
    {
319
    return "Square-2";
320
    }
321

    
322
///////////////////////////////////////////////////////////////////////////////////////////////////
323

    
324
  public String getInventor()
325
    {
326
    return "David Litwin";
327
    }
328

    
329
///////////////////////////////////////////////////////////////////////////////////////////////////
330

    
331
  public int getYearOfInvention()
332
    {
333
    return 1995;
334
    }
335

    
336
///////////////////////////////////////////////////////////////////////////////////////////////////
337

    
338
  public int getComplexity()
339
    {
340
    return 3;
341
    }
342

    
343
///////////////////////////////////////////////////////////////////////////////////////////////////
344

    
345
  public String[][] getTutorials()
346
    {
347
    return new String[][] {
348
                          {"gb","PPXojiFthEs","Square-2 Tutorial","SuperAntoniovivaldi"},
349
                          {"es","IiMwc51xKBQ","Cómo resolver Square-2","skieur cubb"},
350
                          {"ru","XZ6m8uF5oUk","Как собрать Square-2.","Илья Топор-Гилка"},
351
                          {"fr","R-m9IgYAFPA","Tutoriel: résolution du Square-2","skieur cubb"},
352
                          {"pl","SukHyoMzcgM","Square-2 TUTORIAL PL","MrUk"},
353
                          {"br","T3ts5gHLJV8","Tutorial do Square-2 1/2","Rafael Cinoto"},
354
                          {"br","4wwWE5Ni0Fw","Tutorial do Square-2 2/2","Rafael Cinoto"},
355
                          {"kr","psG9Ar4pBrc","초보자를 위한 스퀘어2 해법","SlowCuberToumai"},
356
                          {"vn","_37Pc8Y_-Hs","Square-2 Tutorial","VĂN CÔNG TÙNG"},
357
                         };
358
    }
359
}
(30-30/34)