Revision ef018c1b
Added by Leszek Koltunski over 2 years ago
src/main/java/org/distorted/objects/TwistyMinx.java | ||
---|---|---|
60 | 60 |
private ScrambleState[] mStates; |
61 | 61 |
private int[] mBasicAngle; |
62 | 62 |
private int[] mFaceMap; |
63 |
private float[][] mCuts; |
|
64 |
private boolean[][] mLayerRotatable; |
|
63 | 65 |
private Movement mMovement; |
64 | 66 |
Static4D[] mQuats; |
65 | 67 |
float[][] mCenterCoords; |
... | ... | |
504 | 506 |
if( mQuats==null ) initializeQuats(); |
505 | 507 |
return mQuats; |
506 | 508 |
} |
509 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
510 |
|
|
511 |
float[][] genericGetCuts(int numLayers, float dist) |
|
512 |
{ |
|
513 |
if( mCuts==null ) |
|
514 |
{ |
|
515 |
mCuts = new float[6][numLayers-1]; |
|
516 |
float D = numLayers*MovementMinx.DIST3D; |
|
517 |
float E = 2*SIN54; |
|
518 |
float X = 2*D*E/(1+2*E); // height of the 'upper' part of a dodecahedron, i.e. put it on a table, |
|
519 |
// its height is then D*2*DIST3D, it has one 'lower' part of height X, one |
|
520 |
// 'middle' part of height Y and one upper part of height X again. |
|
521 |
// It's edge length = numLayers/3.0f. |
|
522 |
int num = (numLayers-1)/2; |
|
523 |
float G = X*dist/num; // height of one Layer |
|
524 |
|
|
525 |
for(int i=0; i<num; i++) |
|
526 |
{ |
|
527 |
float cut = -D + (i+0.5f)*G; |
|
528 |
int j = 2*num-1-i; |
|
529 |
mCuts[0][i] = +cut; |
|
530 |
mCuts[0][j] = -cut; |
|
531 |
mCuts[1][i] = +cut; |
|
532 |
mCuts[1][j] = -cut; |
|
533 |
mCuts[2][i] = +cut; |
|
534 |
mCuts[2][j] = -cut; |
|
535 |
mCuts[3][i] = +cut; |
|
536 |
mCuts[3][j] = -cut; |
|
537 |
mCuts[4][i] = +cut; |
|
538 |
mCuts[4][j] = -cut; |
|
539 |
mCuts[5][i] = +cut; |
|
540 |
mCuts[5][j] = -cut; |
|
541 |
} |
|
542 |
} |
|
543 |
|
|
544 |
return mCuts; |
|
545 |
} |
|
546 |
|
|
547 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
548 |
|
|
549 |
private void getLayerRotatable(int numLayers) |
|
550 |
{ |
|
551 |
if( mLayerRotatable==null ) |
|
552 |
{ |
|
553 |
int numAxis = ROT_AXIS.length; |
|
554 |
boolean[] tmp = new boolean[numLayers]; |
|
555 |
for(int i=0; i<numLayers; i++) tmp[i] = true; |
|
556 |
tmp[numLayers/2] = false; |
|
557 |
mLayerRotatable = new boolean[numAxis][]; |
|
558 |
for(int i=0; i<numAxis; i++) mLayerRotatable[i] = tmp; |
|
559 |
} |
|
560 |
} |
|
507 | 561 |
|
508 | 562 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
509 | 563 |
|
... | ... | |
531 | 585 |
|
532 | 586 |
public Movement getMovement() |
533 | 587 |
{ |
534 |
if( mMovement==null ) mMovement = new MovementMinx(); |
|
588 |
if( mMovement==null ) |
|
589 |
{ |
|
590 |
int numLayers = getNumLayers(); |
|
591 |
if( mCuts==null ) getCuts(numLayers); |
|
592 |
getLayerRotatable(numLayers); |
|
593 |
|
|
594 |
mMovement = new MovementMinx(mCuts,mLayerRotatable,numLayers); |
|
595 |
} |
|
535 | 596 |
return mMovement; |
536 | 597 |
} |
537 | 598 |
|
Also available in: Unified diff
Abstract the next function, computeRowFromOffset(), out of the individual Movement classes.
Still two issues:
1) mysterious 1.5 multiplier in Movement12
2) in Movement8, moving the offset works only if the rotAxis are face-turning, i.e. they connect the centers of the opposing faces of the octahedron.