Revision 8c3148e2
Added by Leszek Koltunski over 3 years ago
src/main/java/org/distorted/objects/TwistySkewb.java | ||
---|---|---|
37 | 37 |
|
38 | 38 |
public class TwistySkewb extends TwistyObject |
39 | 39 |
{ |
40 |
private static final int FACES_PER_CUBIT =6; |
|
41 |
|
|
42 | 40 |
// the four rotation axis of a RubikSkewb. Must be normalized. |
43 | 41 |
static final Static3D[] ROT_AXIS = new Static3D[] |
44 | 42 |
{ |
... | ... | |
48 | 46 |
new Static3D(+SQ3/3,-SQ3/3,-SQ3/3) |
49 | 47 |
}; |
50 | 48 |
|
51 |
private static final int[] BASIC_ANGLE = new int[] { 3,3,3,3 }; |
|
52 |
|
|
53 | 49 |
private static final int[] FACE_COLORS = new int[] |
54 | 50 |
{ |
55 | 51 |
COLOR_YELLOW, COLOR_WHITE, |
... | ... | |
57 | 53 |
COLOR_RED , COLOR_ORANGE |
58 | 54 |
}; |
59 | 55 |
|
60 |
// All legal rotation quats of a RubikSkewb |
|
61 |
private static final Static4D[] QUATS = new Static4D[] |
|
62 |
{ |
|
63 |
new Static4D( 0.0f, 0.0f, 0.0f, 1.0f ), |
|
64 |
new Static4D( 1.0f, 0.0f, 0.0f, 0.0f ), |
|
65 |
new Static4D( 0.0f, 1.0f, 0.0f, 0.0f ), |
|
66 |
new Static4D( 0.0f, 0.0f, 1.0f, 0.0f ), |
|
67 |
|
|
68 |
new Static4D( 0.5f, 0.5f, 0.5f, 0.5f ), |
|
69 |
new Static4D( 0.5f, 0.5f, 0.5f, -0.5f ), |
|
70 |
new Static4D( 0.5f, 0.5f, -0.5f, 0.5f ), |
|
71 |
new Static4D( 0.5f, 0.5f, -0.5f, -0.5f ), |
|
72 |
new Static4D( 0.5f, -0.5f, 0.5f, 0.5f ), |
|
73 |
new Static4D( 0.5f, -0.5f, 0.5f, -0.5f ), |
|
74 |
new Static4D( 0.5f, -0.5f, -0.5f, 0.5f ), |
|
75 |
new Static4D( 0.5f, -0.5f, -0.5f, -0.5f ) |
|
76 |
}; |
|
77 |
|
|
78 |
private static final int[][] mCornerMap = |
|
79 |
{ |
|
80 |
{ 4, 2, 0, 18,18,18 }, |
|
81 |
{ 2, 5, 0, 18,18,18 }, |
|
82 |
{ 3, 4, 0, 18,18,18 }, |
|
83 |
{ 5, 3, 0, 18,18,18 }, |
|
84 |
{ 1, 2, 4, 18,18,18 }, |
|
85 |
{ 5, 2, 1, 18,18,18 }, |
|
86 |
{ 4, 3, 1, 18,18,18 }, |
|
87 |
{ 1, 3, 5, 18,18,18 }, |
|
88 |
}; |
|
89 |
|
|
90 |
private static final int[][] mEdgeMap = |
|
91 |
{ |
|
92 |
{ 10, 8, 18,18,18,18 }, |
|
93 |
{ 6,10, 18,18,18,18 }, |
|
94 |
{ 10, 9, 18,18,18,18 }, |
|
95 |
{ 7,10, 18,18,18,18 }, |
|
96 |
{ 8, 6, 18,18,18,18 }, |
|
97 |
{ 9, 6, 18,18,18,18 }, |
|
98 |
{ 9, 7, 18,18,18,18 }, |
|
99 |
{ 8, 7, 18,18,18,18 }, |
|
100 |
{ 11, 8, 18,18,18,18 }, |
|
101 |
{ 6,11, 18,18,18,18 }, |
|
102 |
{ 11, 9, 18,18,18,18 }, |
|
103 |
{ 7,11, 18,18,18,18 } |
|
104 |
}; |
|
105 |
|
|
106 |
private static final int[][] mCenterMap = |
|
107 |
{ |
|
108 |
{ 12, 18,18,18,18,18 }, |
|
109 |
{ 13, 18,18,18,18,18 }, |
|
110 |
{ 14, 18,18,18,18,18 }, |
|
111 |
{ 15, 18,18,18,18,18 }, |
|
112 |
{ 16, 18,18,18,18,18 }, |
|
113 |
{ 17, 18,18,18,18,18 }, |
|
114 |
}; |
|
115 |
|
|
116 |
private static final double[][] VERTICES_CORNER = new double[][] |
|
117 |
{ |
|
118 |
{-0.5f, 0.0f, 0.0f}, |
|
119 |
{ 0.0f,-0.5f, 0.0f}, |
|
120 |
{ 0.0f, 0.0f,-0.5f}, |
|
121 |
{-0.5f,-0.5f,-0.5f}, |
|
122 |
{ 0.0f, 0.0f, 0.0f} |
|
123 |
}; |
|
124 |
|
|
125 |
private static final int[][] VERT_INDEXES_CORNER = new int[][] |
|
126 |
{ |
|
127 |
{0,1,4}, |
|
128 |
{2,0,4}, |
|
129 |
{1,2,4}, |
|
130 |
{3,1,0}, |
|
131 |
{3,2,1}, |
|
132 |
{3,0,2} |
|
133 |
}; |
|
134 |
|
|
135 |
private static final double[][] VERTICES_EDGE = new double[][] |
|
136 |
{ |
|
137 |
{-0.5, 0.0, 0.0}, |
|
138 |
{ 0.5, 0.0, 0.0}, |
|
139 |
{ 0.0,-0.5, 0.0}, |
|
140 |
{ 0.0, 0.0,-0.5} |
|
141 |
}; |
|
142 |
|
|
143 |
private static final int[][] VERT_INDEXES_EDGE = new int[][] |
|
144 |
{ |
|
145 |
{2,1,0}, // counterclockwise! |
|
146 |
{3,0,1}, |
|
147 |
{2,3,1}, |
|
148 |
{3,2,0}, |
|
149 |
}; |
|
150 |
|
|
151 |
private static final double[][] VERTICES_FACE = new double[][] |
|
152 |
{ |
|
153 |
{-0.5f, 0.0f, 0.0f }, |
|
154 |
{ 0.0f,-0.5f, 0.0f }, |
|
155 |
{ 0.5f, 0.0f, 0.0f }, |
|
156 |
{ 0.0f, 0.5f, 0.0f }, |
|
157 |
{ 0.0f, 0.0f,-0.5f } |
|
158 |
}; |
|
159 |
|
|
160 |
private static final int[][] VERT_INDEXES_FACE = new int[][] |
|
161 |
{ |
|
162 |
{0,1,2,3}, |
|
163 |
{4,1,0}, |
|
164 |
{4,2,1}, |
|
165 |
{4,3,2}, |
|
166 |
{4,0,3} |
|
167 |
}; |
|
168 |
|
|
169 |
private static final float[][] STICKERS = new float[][] |
|
170 |
{ |
|
171 |
{ -0.5f, 0.25f, 0.25f, -0.5f, 0.25f, 0.25f }, |
|
172 |
{ -0.5f, 0.00f, 0.00f, -0.5f, 0.50f, 0.0f, 0.0f, 0.5f } |
|
173 |
}; |
|
174 |
|
|
175 |
private static final ObjectSticker[] mStickers; |
|
176 |
|
|
177 |
static |
|
178 |
{ |
|
179 |
mStickers = new ObjectSticker[STICKERS.length+1]; |
|
180 |
final float R1 = 0.025f; |
|
181 |
final float R2 = 0.025f; |
|
182 |
final float R3 = 0.055f; |
|
183 |
final float[][] radii = { { R1,R1,R1 },{ R2,R2,R2 },{ R3,R3,R3,R3 } }; |
|
184 |
final float[] strokes = { 0.045f, 0.035f, 0.035f }; |
|
185 |
|
|
186 |
for(int s=0; s<STICKERS.length+1; s++) |
|
187 |
{ |
|
188 |
int index = s<2 ? 0:1; |
|
189 |
mStickers[s] = new ObjectSticker(STICKERS[index],null,radii[s],strokes[s]); |
|
190 |
} |
|
191 |
} |
|
192 |
|
|
193 | 56 |
private int mCurrState; |
194 | 57 |
private int mIndexExcluded; |
195 | 58 |
private final ScrambleState[] mStates; |
196 | 59 |
private int[][] mScrambleTable; |
197 | 60 |
private int[] mNumOccurences; |
61 |
private int[] mBasicAngle; |
|
62 |
private Static4D[] mQuats; |
|
63 |
private int[][] mCornerMap,mEdgeMap,mCenterMap; |
|
64 |
private ObjectSticker[] mStickers; |
|
198 | 65 |
|
199 | 66 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
200 | 67 |
|
... | ... | |
211 | 78 |
}; |
212 | 79 |
} |
213 | 80 |
|
81 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
82 |
|
|
83 |
private void initializeQuats() |
|
84 |
{ |
|
85 |
mQuats = new Static4D[] |
|
86 |
{ |
|
87 |
new Static4D( 0.0f, 0.0f, 0.0f, 1.0f ), |
|
88 |
new Static4D( 1.0f, 0.0f, 0.0f, 0.0f ), |
|
89 |
new Static4D( 0.0f, 1.0f, 0.0f, 0.0f ), |
|
90 |
new Static4D( 0.0f, 0.0f, 1.0f, 0.0f ), |
|
91 |
|
|
92 |
new Static4D( 0.5f, 0.5f, 0.5f, 0.5f ), |
|
93 |
new Static4D( 0.5f, 0.5f, 0.5f, -0.5f ), |
|
94 |
new Static4D( 0.5f, 0.5f, -0.5f, 0.5f ), |
|
95 |
new Static4D( 0.5f, 0.5f, -0.5f, -0.5f ), |
|
96 |
new Static4D( 0.5f, -0.5f, 0.5f, 0.5f ), |
|
97 |
new Static4D( 0.5f, -0.5f, 0.5f, -0.5f ), |
|
98 |
new Static4D( 0.5f, -0.5f, -0.5f, 0.5f ), |
|
99 |
new Static4D( 0.5f, -0.5f, -0.5f, -0.5f ) |
|
100 |
}; |
|
101 |
} |
|
102 |
|
|
214 | 103 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
215 | 104 |
|
216 | 105 |
int[] getSolvedQuats(int cubit, int numLayers) |
217 | 106 |
{ |
107 |
if( mQuats==null ) initializeQuats(); |
|
218 | 108 |
int status = retCubitSolvedStatus(cubit,numLayers); |
219 |
return status<0 ? null : buildSolvedQuats(MovementSkewb.FACE_AXIS[status],QUATS);
|
|
109 |
return status<0 ? null : buildSolvedQuats(MovementSkewb.FACE_AXIS[status],mQuats);
|
|
220 | 110 |
} |
221 | 111 |
|
222 | 112 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
251 | 141 |
|
252 | 142 |
Static4D[] getQuats() |
253 | 143 |
{ |
254 |
return QUATS; |
|
144 |
if( mQuats==null ) initializeQuats(); |
|
145 |
return mQuats; |
|
255 | 146 |
} |
256 | 147 |
|
257 | 148 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
300 | 191 |
|
301 | 192 |
int getNumCubitFaces() |
302 | 193 |
{ |
303 |
return FACES_PER_CUBIT;
|
|
194 |
return 6;
|
|
304 | 195 |
} |
305 | 196 |
|
306 | 197 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
435 | 326 |
|
436 | 327 |
Static4D getQuat(int cubit, int numLayers) |
437 | 328 |
{ |
329 |
if( mQuats==null ) initializeQuats(); |
|
438 | 330 |
int numCorners = getNumCorners(); |
439 | 331 |
int numEdges = getNumEdges(numLayers); |
440 | 332 |
|
... | ... | |
442 | 334 |
{ |
443 | 335 |
switch(cubit) |
444 | 336 |
{ |
445 |
case 0: return QUATS[0]; // unit quat
|
|
337 |
case 0: return mQuats[0]; // unit quat
|
|
446 | 338 |
case 1: return new Static4D( SQ2/2,0,0,SQ2/2); // 90 along X |
447 | 339 |
case 2: return new Static4D(-SQ2/2,0,0,SQ2/2); // -90 along X |
448 |
case 3: return QUATS[1]; // 180 along X
|
|
340 |
case 3: return mQuats[1]; // 180 along X
|
|
449 | 341 |
case 4: return new Static4D(0, SQ2/2,0,SQ2/2); // 90 along Y |
450 |
case 5: return QUATS[2]; // 180 along Y
|
|
451 |
case 6: return QUATS[3]; // 180 along Z
|
|
342 |
case 5: return mQuats[2]; // 180 along Y
|
|
343 |
case 6: return mQuats[3]; // 180 along Z
|
|
452 | 344 |
case 7: return new Static4D(SQ2/2,0,-SQ2/2,0); // 180 along (SQ2/2,0,-SQ2/2) |
453 | 345 |
} |
454 | 346 |
} |
... | ... | |
458 | 350 |
|
459 | 351 |
switch(edge) |
460 | 352 |
{ |
461 |
case 0: return QUATS[ 0];
|
|
462 |
case 1: return QUATS[ 5];
|
|
463 |
case 2: return QUATS[ 3];
|
|
464 |
case 3: return QUATS[11];
|
|
465 |
case 4: return QUATS[ 4];
|
|
466 |
case 5: return QUATS[ 7];
|
|
467 |
case 6: return QUATS[ 9];
|
|
468 |
case 7: return QUATS[10];
|
|
469 |
case 8: return QUATS[ 2];
|
|
470 |
case 9: return QUATS[ 8];
|
|
471 |
case 10: return QUATS[ 1];
|
|
472 |
case 11: return QUATS[ 6];
|
|
353 |
case 0: return mQuats[ 0];
|
|
354 |
case 1: return mQuats[ 5];
|
|
355 |
case 2: return mQuats[ 3];
|
|
356 |
case 3: return mQuats[11];
|
|
357 |
case 4: return mQuats[ 4];
|
|
358 |
case 5: return mQuats[ 7];
|
|
359 |
case 6: return mQuats[ 9];
|
|
360 |
case 7: return mQuats[10];
|
|
361 |
case 8: return mQuats[ 2];
|
|
362 |
case 9: return mQuats[ 8];
|
|
363 |
case 10: return mQuats[ 1];
|
|
364 |
case 11: return mQuats[ 6];
|
|
473 | 365 |
} |
474 | 366 |
} |
475 | 367 |
else |
... | ... | |
482 | 374 |
case 1: return new Static4D(0, SQ2/2,0,SQ2/2); // 90 along Y |
483 | 375 |
case 2: return new Static4D( SQ2/2,0,0,SQ2/2); // 90 along X |
484 | 376 |
case 3: return new Static4D(-SQ2/2,0,0,SQ2/2); // -90 along X |
485 |
case 4: return QUATS[0]; // unit quaternion
|
|
486 |
case 5: return QUATS[1]; // 180 along X
|
|
377 |
case 4: return mQuats[0]; // unit quaternion
|
|
378 |
case 5: return mQuats[1]; // 180 along X
|
|
487 | 379 |
} |
488 | 380 |
} |
489 | 381 |
|
... | ... | |
498 | 390 |
|
499 | 391 |
if( variant==0 ) |
500 | 392 |
{ |
393 |
double[][] vertices = new double[][] { {-0.5f, 0.0f, 0.0f},{ 0.0f,-0.5f, 0.0f},{ 0.0f, 0.0f,-0.5f},{-0.5f,-0.5f,-0.5f},{ 0.0f, 0.0f, 0.0f} }; |
|
394 |
int[][] vert_indices = new int[][] { {0,1,4},{2,0,4},{1,2,4},{3,1,0},{3,2,1},{3,0,2} }; |
|
501 | 395 |
int N = numLayers==2 ? 7:5; |
502 | 396 |
int E1= numLayers==2 ? 3:2; |
503 | 397 |
int E2= numLayers==2 ? 5:3; |
... | ... | |
507 | 401 |
int[] cornerIndices = new int[] { 1,1,1,0,0 }; |
508 | 402 |
float[][] centers = new float[][] { {-0.25f, -0.25f, -0.25f} }; |
509 | 403 |
int[] centerIndices = new int[] { 0,0,0,-1,0 }; |
510 |
return new ObjectShape(VERTICES_CORNER,VERT_INDEXES_CORNER,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
404 |
return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
511 | 405 |
} |
512 | 406 |
else if( variant==1 ) |
513 | 407 |
{ |
408 |
double[][] vertices = new double[][] { {-0.5, 0.0, 0.0},{ 0.5, 0.0, 0.0},{ 0.0,-0.5, 0.0},{ 0.0, 0.0,-0.5} }; |
|
409 |
int[][] vert_indices = new int[][] { {2,1,0},{3,0,1},{2,3,1},{3,2,0} }; |
|
514 | 410 |
int N = numLayers==2 ? 7:5; |
515 | 411 |
int E = numLayers==2 ? 5:2; |
516 | 412 |
float[][] bands = new float[][] { {0.035f,30,0.16f,0.8f,N,2,E}, {0.020f,45,0.16f,0.2f,3,1,2} }; |
... | ... | |
519 | 415 |
int[] cornerIndices = new int[] { 0,0,1,1 }; |
520 | 416 |
float[][] centers = new float[][] { {0.0f, -0.25f, -0.25f} }; |
521 | 417 |
int[] centerIndices = new int[] { 0,0,0,0 }; |
522 |
return new ObjectShape(VERTICES_EDGE,VERT_INDEXES_EDGE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
418 |
return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
523 | 419 |
} |
524 | 420 |
else |
525 | 421 |
{ |
422 |
double[][] vertices = new double[][] { {-0.5f, 0.0f, 0.0f },{ 0.0f,-0.5f, 0.0f },{ 0.5f, 0.0f, 0.0f },{ 0.0f, 0.5f, 0.0f },{ 0.0f, 0.0f,-0.5f } }; |
|
423 |
int[][] vert_indices = new int[][] { {0,1,2,3},{4,1,0},{4,2,1},{4,3,2},{4,0,3} }; |
|
526 | 424 |
int N = numLayers==2 ? 7:6; |
527 | 425 |
int E = numLayers==2 ? 3:1; |
528 | 426 |
float[][] bands = new float[][] { {0.051f,35,SQ2/8,0.9f,N,E,E}, {0.000f,0,1,0.0f,3,0,0} }; |
... | ... | |
531 | 429 |
int[] cornerIndices = new int[] { 0,0,0,0,0 }; |
532 | 430 |
float[][] centers = new float[][] { {0,0,-0.2f} }; |
533 | 431 |
int[] centerIndices = new int[] { 0,0,0,0,-1 }; |
534 |
return new ObjectShape(VERTICES_FACE,VERT_INDEXES_FACE,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
432 |
return new ObjectShape(vertices,vert_indices,bands,bandIndices,corners,cornerIndices,centers,centerIndices,getNumCubitFaces(), null);
|
|
535 | 433 |
} |
536 | 434 |
} |
537 | 435 |
|
... | ... | |
556 | 454 |
|
557 | 455 |
int getFaceColor(int cubit, int cubitface, int numLayers) |
558 | 456 |
{ |
457 |
if( mCornerMap==null || mEdgeMap==null || mCenterMap==null ) |
|
458 |
{ |
|
459 |
mCornerMap = new int[][] |
|
460 |
{ |
|
461 |
{ 4, 2, 0, 18,18,18 }, |
|
462 |
{ 2, 5, 0, 18,18,18 }, |
|
463 |
{ 3, 4, 0, 18,18,18 }, |
|
464 |
{ 5, 3, 0, 18,18,18 }, |
|
465 |
{ 1, 2, 4, 18,18,18 }, |
|
466 |
{ 5, 2, 1, 18,18,18 }, |
|
467 |
{ 4, 3, 1, 18,18,18 }, |
|
468 |
{ 1, 3, 5, 18,18,18 }, |
|
469 |
}; |
|
470 |
|
|
471 |
mEdgeMap = new int[][] |
|
472 |
{ |
|
473 |
{ 10, 8, 18,18,18,18 }, |
|
474 |
{ 6,10, 18,18,18,18 }, |
|
475 |
{ 10, 9, 18,18,18,18 }, |
|
476 |
{ 7,10, 18,18,18,18 }, |
|
477 |
{ 8, 6, 18,18,18,18 }, |
|
478 |
{ 9, 6, 18,18,18,18 }, |
|
479 |
{ 9, 7, 18,18,18,18 }, |
|
480 |
{ 8, 7, 18,18,18,18 }, |
|
481 |
{ 11, 8, 18,18,18,18 }, |
|
482 |
{ 6,11, 18,18,18,18 }, |
|
483 |
{ 11, 9, 18,18,18,18 }, |
|
484 |
{ 7,11, 18,18,18,18 } |
|
485 |
}; |
|
486 |
|
|
487 |
mCenterMap = new int[][] |
|
488 |
{ |
|
489 |
{ 12, 18,18,18,18,18 }, |
|
490 |
{ 13, 18,18,18,18,18 }, |
|
491 |
{ 14, 18,18,18,18,18 }, |
|
492 |
{ 15, 18,18,18,18,18 }, |
|
493 |
{ 16, 18,18,18,18,18 }, |
|
494 |
{ 17, 18,18,18,18,18 }, |
|
495 |
}; |
|
496 |
} |
|
497 |
|
|
559 | 498 |
int numCorners = getNumCorners(); |
560 | 499 |
int numEdges = getNumEdges(numLayers); |
561 | 500 |
|
... | ... | |
586 | 525 |
|
587 | 526 |
ObjectSticker retSticker(int face) |
588 | 527 |
{ |
528 |
if( mStickers==null ) |
|
529 |
{ |
|
530 |
float[][] STICKERS = new float[][] |
|
531 |
{ |
|
532 |
{ -0.5f, 0.25f, 0.25f, -0.5f, 0.25f, 0.25f }, |
|
533 |
{ -0.5f, 0.00f, 0.00f, -0.5f, 0.50f, 0.0f, 0.0f, 0.5f } |
|
534 |
}; |
|
535 |
|
|
536 |
final float R1 = 0.025f; |
|
537 |
final float R2 = 0.025f; |
|
538 |
final float R3 = 0.055f; |
|
539 |
final float[][] radii = { { R1,R1,R1 },{ R2,R2,R2 },{ R3,R3,R3,R3 } }; |
|
540 |
final float[] strokes = { 0.045f, 0.035f, 0.035f }; |
|
541 |
|
|
542 |
mStickers = new ObjectSticker[STICKERS.length+1]; |
|
543 |
|
|
544 |
for(int s=0; s<STICKERS.length+1; s++) |
|
545 |
{ |
|
546 |
int index = s<2 ? 0:1; |
|
547 |
mStickers[s] = new ObjectSticker(STICKERS[index],null,radii[s],strokes[s]); |
|
548 |
} |
|
549 |
} |
|
550 |
|
|
589 | 551 |
return mStickers[face/NUM_FACES]; |
590 | 552 |
} |
591 | 553 |
|
... | ... | |
656 | 618 |
|
657 | 619 |
public int[] getBasicAngle() |
658 | 620 |
{ |
659 |
return BASIC_ANGLE; |
|
621 |
if( mBasicAngle ==null ) mBasicAngle = new int[] { 3,3,3,3 }; |
|
622 |
return mBasicAngle; |
|
660 | 623 |
} |
661 | 624 |
|
662 | 625 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
Also available in: Unified diff
Remove statics from the Skewb class.