Project

General

Profile

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

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

1
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2022 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
import org.distorted.objectlib.helpers.ObjectFaceShape;
27
import org.distorted.objectlib.helpers.ObjectShape;
28
import org.distorted.objectlib.main.ObjectType;
29

    
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31

    
32
public class TwistyCrystal extends TwistyMinx
33
{
34
  private static final float A = (SQ5+5)/10;
35

    
36
  private float[][] mCuts;
37
  private float[][] mPosition;
38
  private int[] mQuatIndex;
39

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

    
42
  public TwistyCrystal(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
  public float[][] getCubitPositions(int[] numLayers)
50
    {
51
    if( mPosition==null )
52
      {
53
      if( mEdgeMap==null ) initializeEdgeMap();
54
      if( mCenterCoords==null ) initializeCenterCoords();
55

    
56
      mPosition = new float[NUM_EDGES+NUM_CORNERS][3];
57

    
58
      for(int edge=0; edge<NUM_EDGES; edge++)
59
        {
60
        float[] c1 = mCorners[ mEdgeMap[edge][0] ];
61
        float[] c2 = mCorners[ mEdgeMap[edge][1] ];
62

    
63
        mPosition[edge][0] = (c1[0]+c2[0])/2;
64
        mPosition[edge][1] = (c1[1]+c2[1])/2;
65
        mPosition[edge][2] = (c1[2]+c2[2])/2;
66
        }
67

    
68
      System.arraycopy(mCorners, 0, mPosition, NUM_EDGES, NUM_CORNERS);
69
      }
70

    
71
    return mPosition;
72
    }
73

    
74
///////////////////////////////////////////////////////////////////////////////////////////////////
75

    
76
  public Static4D getCubitQuats(int cubit, int[] numLayers)
77
    {
78
    if( mQuatIndex==null ) mQuatIndex = new int[] { 17,12,13,20, 0, 4,25, 5,24,16,
79
                                                     9,21, 1,34, 8,11,30,43,26,14,
80
                                                    15,45,33,28,10, 2,29, 6, 7, 3,
81

    
82
                                                     0, 2,20,42,13,41,16,33, 8,51,
83
                                                     1,25,12,27, 4, 3,21,28, 5, 6 };
84
    return mObjectQuats[mQuatIndex[cubit]];
85
    }
86

    
87
///////////////////////////////////////////////////////////////////////////////////////////////////
88

    
89
  public ObjectShape getObjectShape(int variant)
90
    {
91
    if( variant==0 )
92
      {
93
      float B = mCenterCoords[0][2]-mCorners[0][2];
94
      float C = A*mCorners[0][1]+(1.0f-A)*mCorners[2][1];
95
      float D = mCenterCoords[0][0];
96

    
97
      float[][] vertices =
98
         {
99
             { 0.0f, C, 0,0f },
100
             { 0.0f,-C, 0,0f },
101
             {   -D,0.0f,  B },
102
             {   +D,0.0f,  B },
103
         };
104
      int[][] indices =
105
         {
106
             {1,0,2},
107
             {0,1,3},
108
             {2,3,1},
109
             {3,2,0}
110
         };
111

    
112
      return new ObjectShape(vertices, indices);
113
      }
114
    else
115
      {
116
      float X = mCorners[0][0];
117
      float Y = mCorners[0][1];
118
      float Z = mCorners[0][2];
119

    
120
      float X1 = A*mCorners[0][0]+(1.0f-A)*mCorners[16][0];
121
      float Y1 = A*mCorners[0][1]+(1.0f-A)*mCorners[16][1];
122
      float Z1 = A*mCorners[0][2]+(1.0f-A)*mCorners[16][2];
123
      float X2 = A*mCorners[0][0]+(1.0f-A)*mCorners[12][0];
124
      float Y2 = A*mCorners[0][1]+(1.0f-A)*mCorners[12][1];
125
      float Z2 = A*mCorners[0][2]+(1.0f-A)*mCorners[12][2];
126
      float X3 = A*mCorners[0][0]+(1.0f-A)*mCorners[ 2][0];
127
      float Y3 = A*mCorners[0][1]+(1.0f-A)*mCorners[ 2][1];
128
      float Z3 = A*mCorners[0][2]+(1.0f-A)*mCorners[ 2][2];
129

    
130
      float[][] vertices =
131
         {
132
             {0.0f, 0.0f, 0.0f},
133
             {X1-X, Y1-Y, Z1-Z},
134
             {X2-X, Y2-Y, Z2-Z},
135
             {X3-X, Y3-Y, Z3-Z},
136
             { mCenterCoords[0][0]-X, mCenterCoords[0][1]-Y, mCenterCoords[0][2]-Z },
137
             { mCenterCoords[1][0]-X, mCenterCoords[1][1]-Y, mCenterCoords[1][2]-Z },
138
             { mCenterCoords[8][0]-X, mCenterCoords[8][1]-Y, mCenterCoords[8][2]-Z }
139
         };
140
      int[][] indices =
141
         {
142
             { 5,3,0,1 },
143
             { 4,2,0,3 },
144
             { 6,1,0,2 },
145
             { 5,4,3 },
146
             { 4,6,2 },
147
             { 6,5,1 },
148
             { 6,4,5 }
149
         };
150

    
151
      return new ObjectShape(vertices, indices);
152
      }
153
    }
154

    
155
///////////////////////////////////////////////////////////////////////////////////////////////////
156

    
157
  public ObjectFaceShape getObjectFaceShape(int variant)
158
    {
159
    if( variant==0 )
160
      {
161
      float h1 = isInIconMode() ? 0.001f : 0.03f;
162
      float h2 = isInIconMode() ? 0.001f : 0.01f;
163
      float[][] bands     = { {h1,17,0.5f,0.2f,5,1,0}, {h2, 1,0.5f,0.2f,5,1,0} };
164
      int[] bandIndices   = { 0,0,1,1 };
165
      float[][] corners   = { { 0.015f, 0.20f } };
166
      int[] cornerIndices = { 0,0,0,0 };
167
      float[][] centers   = { { 0.0f,0.0f,-mCorners[0][2] } };
168
      int[] centerIndices = { 0,0,0,0 };
169
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
170
      }
171
    else
172
      {
173
      float h1 = isInIconMode() ? 0.001f : 0.03f;
174
      float h2 = isInIconMode() ? 0.001f : 0.01f;
175
      float[][] bands     = { {h1,17,0.5f,0.2f,5,1,0}, {h2, 1,0.5f,0.2f,5,1,0}, {h2, 1,0.5f,0.2f,3,0,0} };
176
      int[] bandIndices   = { 0,0,0,1,1,1,2 };
177
      float[][] corners   = { { 0.01f, 0.20f } };
178
      int[] cornerIndices = { 0,0,0,0,0,0,0 };
179
      float[][] centers   = { { 0.0f,-1.5f,-mCorners[0][2] } };
180
      int[] centerIndices = { 0,0,0,0,0,0,0 };
181
      return new ObjectFaceShape(bands,bandIndices,corners,cornerIndices,centers,centerIndices,null);
182
      }
183
    }
184

    
185
///////////////////////////////////////////////////////////////////////////////////////////////////
186

    
187
  public int getNumCubitVariants(int[] numLayers)
188
    {
189
    return 2;
190
    }
191

    
192
///////////////////////////////////////////////////////////////////////////////////////////////////
193

    
194
  public int getCubitVariant(int cubit, int[] numLayers)
195
    {
196
    return cubit<NUM_EDGES ? 0:1;
197
    }
198

    
199
///////////////////////////////////////////////////////////////////////////////////////////////////
200

    
201
  public float[][] getCuts(int[] numLayers)
202
    {
203
    if( mCuts==null )
204
      {
205
      float CUT = 1.5f; // TODO
206
      float[] cut = new float[] { -CUT,+CUT };
207
      mCuts = new float[][] { cut,cut,cut,cut,cut,cut };
208
      }
209

    
210
    return mCuts;
211
    }
212

    
213
///////////////////////////////////////////////////////////////////////////////////////////////////
214

    
215
  public float getStickerRadius()
216
    {
217
    return 0.18f;
218
    }
219

    
220
///////////////////////////////////////////////////////////////////////////////////////////////////
221

    
222
  public float getStickerStroke()
223
    {
224
    return isInIconMode() ? 0.22f : 0.15f;
225
    }
226

    
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228

    
229
  public float[][] getStickerAngles()
230
    {
231
    return null;
232
    }
233

    
234
///////////////////////////////////////////////////////////////////////////////////////////////////
235
// PUBLIC API
236

    
237
  public String getShortName()
238
    {
239
    return ObjectType.CRYS_3.name();
240
    }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243

    
244
  public long getSignature()
245
    {
246
    return ObjectType.CRYS_3.ordinal();
247
    }
248

    
249
///////////////////////////////////////////////////////////////////////////////////////////////////
250

    
251
  public String getObjectName()
252
    {
253
    return "Pyraminx Crystal";
254
    }
255

    
256
///////////////////////////////////////////////////////////////////////////////////////////////////
257

    
258
  public String getInventor()
259
    {
260
    return "Aleh Hladzilin";
261
    }
262

    
263
///////////////////////////////////////////////////////////////////////////////////////////////////
264

    
265
  public int getYearOfInvention()
266
    {
267
    return 2006;
268
    }
269

    
270
///////////////////////////////////////////////////////////////////////////////////////////////////
271

    
272
  public int getComplexity()
273
    {
274
    return 3;
275
    }
276

    
277
///////////////////////////////////////////////////////////////////////////////////////////////////
278

    
279
  public String[][] getTutorials()
280
    {
281
    return new String[][]{
282
                          {"gb","tFSGC9esay0","Pyraminx Crystal Tutorial","twistypuzzling"},
283
                          {"es","AmrIwSICFB8","Como resolver Pyraminx Crystal","Tutoriales Rubik"},
284
                          {"ru","3AKeT8JIU0E","Как собрать Crystal Pyraminx","RBcuber"},
285
                          {"fr","SPsrHhQzmVg","Résolution du Pyraminx Crystal","asthalis"},
286
                          {"de","EH4sw7_21eA","Crystal Pyraminx Tutorial","GerCubing"},
287
                          {"pl","AmrIwSICFB8","Crystal Pyraminx TUTORIAL PL","MrUK"},
288
                          {"br","13pz0cNBVow","Como resolver o Pyraminx Crystal 1/3","RafaelCinoto"},
289
                          {"br","eT654oZsBg0","Como resolver o Pyraminx Crystal 2/3","RafaelCinoto"},
290
                          {"br","MnooQbVFbfU","Como resolver o Pyraminx Crystal 3/3","RafaelCinoto"},
291
                          {"kr","o-w_ZzDrfFU","피라밍크스 크리스탈 해법 1/2","SlowCuberToumai"},
292
                          {"kr","ExMg8SAge4Q","피라밍크스 크리스탈 해법 2/2","SlowCuberToumai"},
293
                          {"vn","MxF4bKlnIMU","Tutorial N.28 - Pyraminx Crystal","Duy Thích Rubik"},
294
                         };
295
    }
296
}
(9-9/34)