Project

General

Profile

« Previous | Next » 

Revision ef018c1b

Added by Leszek Koltunski over 2 years ago

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.

View differences:

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