Revision 348dfe69
Added by Leszek Koltunski over 5 years ago
| src/main/java/org/distorted/effect/solve/SolveEffectSpin.java | ||
|---|---|---|
| 33 | 33 | 
      {
   | 
| 34 | 34 | 
    private static Static4D quatMultiply( Static4D quat1, Static4D quat2 )  | 
| 35 | 35 | 
        {
   | 
| 36 | 
        float qx = quat1.get1();
   | 
|
| 37 | 
        float qy = quat1.get2();
   | 
|
| 38 | 
        float qz = quat1.get3();
   | 
|
| 39 | 
        float qw = quat1.get4();
   | 
|
| 36 | 
        float qx = quat1.get0();
   | 
|
| 37 | 
        float qy = quat1.get1();
   | 
|
| 38 | 
        float qz = quat1.get2();
   | 
|
| 39 | 
        float qw = quat1.get3();
   | 
|
| 40 | 40 | 
     | 
| 41 | 
        float rx = quat2.get1();
   | 
|
| 42 | 
        float ry = quat2.get2();
   | 
|
| 43 | 
        float rz = quat2.get3();
   | 
|
| 44 | 
        float rw = quat2.get4();
   | 
|
| 41 | 
        float rx = quat2.get0();
   | 
|
| 42 | 
        float ry = quat2.get1();
   | 
|
| 43 | 
        float rz = quat2.get2();
   | 
|
| 44 | 
        float rw = quat2.get3();
   | 
|
| 45 | 45 | 
     | 
| 46 | 46 | 
    float tx = rw*qx - rz*qy + ry*qz + rx*qw;  | 
| 47 | 47 | 
    float ty = rw*qy + rz*qx + ry*qw - rx*qz;  | 
| ... | ... | |
| 56 | 56 | 
     | 
| 57 | 57 | 
    private static Static4D rotateVectorByInvertedQuat(Static4D vector, Static4D quat)  | 
| 58 | 58 | 
        {
   | 
| 59 | 
        float qx = quat.get1();
   | 
|
| 60 | 
        float qy = quat.get2();
   | 
|
| 61 | 
        float qz = quat.get3();
   | 
|
| 62 | 
        float qw = quat.get4();
   | 
|
| 59 | 
        float qx = quat.get0();
   | 
|
| 60 | 
        float qy = quat.get1();
   | 
|
| 61 | 
        float qz = quat.get2();
   | 
|
| 62 | 
        float qw = quat.get3();
   | 
|
| 63 | 63 | 
     | 
| 64 | 64 | 
    Static4D quatInverted= new Static4D(-qx,-qy,-qz,qw);  | 
| 65 | 65 | 
    Static4D tmp = quatMultiply(quatInverted,vector);  | 
| ... | ... | |
| 78 | 78 | 
    Static4D tmpAxis = new Static4D(0,1,0,0); // vert axis no matter  | 
| 79 | 79 | 
    Static4D rotated = rotateVectorByInvertedQuat(tmpAxis,quaternion); // how cube is rotated  | 
| 80 | 80 | 
     | 
| 81 | 
        Static3D axis  = new Static3D(rotated.get1(), rotated.get2(), rotated.get3());
   | 
|
| 81 | 
        Static3D axis  = new Static3D(rotated.get0(), rotated.get1(), rotated.get2());
   | 
|
| 82 | 82 | 
    Static3D center= new Static3D(0,0,0);  | 
| 83 | 83 | 
     | 
| 84 | 84 | 
    Dynamic1D d = new Dynamic1D(duration/2, 1.0f);  | 
| src/main/java/org/distorted/magic/RubikSurfaceView.java | ||
|---|---|---|
| 73 | 73 | 
     | 
| 74 | 74 | 
    public static Static4D quatMultiply( Static4D quat1, Static4D quat2 )  | 
| 75 | 75 | 
          {
   | 
| 76 | 
          float qx = quat1.get1();
   | 
|
| 77 | 
          float qy = quat1.get2();
   | 
|
| 78 | 
          float qz = quat1.get3();
   | 
|
| 79 | 
          float qw = quat1.get4();
   | 
|
| 76 | 
          float qx = quat1.get0();
   | 
|
| 77 | 
          float qy = quat1.get1();
   | 
|
| 78 | 
          float qz = quat1.get2();
   | 
|
| 79 | 
          float qw = quat1.get3();
   | 
|
| 80 | 80 | 
     | 
| 81 | 
          float rx = quat2.get1();
   | 
|
| 82 | 
          float ry = quat2.get2();
   | 
|
| 83 | 
          float rz = quat2.get3();
   | 
|
| 84 | 
          float rw = quat2.get4();
   | 
|
| 81 | 
          float rx = quat2.get0();
   | 
|
| 82 | 
          float ry = quat2.get1();
   | 
|
| 83 | 
          float rz = quat2.get2();
   | 
|
| 84 | 
          float rw = quat2.get3();
   | 
|
| 85 | 85 | 
     | 
| 86 | 86 | 
    float tx = rw*qx - rz*qy + ry*qz + rx*qw;  | 
| 87 | 87 | 
    float ty = rw*qy + rz*qx + ry*qw - rx*qz;  | 
| ... | ... | |
| 96 | 96 | 
     | 
| 97 | 97 | 
    public static Static4D rotateVectorByQuat(Static4D vector, Static4D quat)  | 
| 98 | 98 | 
          {
   | 
| 99 | 
          float qx = quat.get1();
   | 
|
| 100 | 
          float qy = quat.get2();
   | 
|
| 101 | 
          float qz = quat.get3();
   | 
|
| 102 | 
          float qw = quat.get4();
   | 
|
| 99 | 
          float qx = quat.get0();
   | 
|
| 100 | 
          float qy = quat.get1();
   | 
|
| 101 | 
          float qz = quat.get2();
   | 
|
| 102 | 
          float qw = quat.get3();
   | 
|
| 103 | 103 | 
     | 
| 104 | 104 | 
    Static4D quatInverted= new Static4D(-qx,-qy,-qz,qw);  | 
| 105 | 105 | 
    Static4D tmp = quatMultiply(quat,vector);  | 
| ... | ... | |
| 112 | 112 | 
     | 
| 113 | 113 | 
    public static Static4D rotateVectorByInvertedQuat(Static4D vector, Static4D quat)  | 
| 114 | 114 | 
          {
   | 
| 115 | 
          float qx = quat.get1();
   | 
|
| 116 | 
          float qy = quat.get2();
   | 
|
| 117 | 
          float qz = quat.get3();
   | 
|
| 118 | 
          float qw = quat.get4();
   | 
|
| 115 | 
          float qx = quat.get0();
   | 
|
| 116 | 
          float qy = quat.get1();
   | 
|
| 117 | 
          float qz = quat.get2();
   | 
|
| 118 | 
          float qw = quat.get3();
   | 
|
| 119 | 119 | 
     | 
| 120 | 120 | 
    Static4D quatInverted= new Static4D(-qx,-qy,-qz,qw);  | 
| 121 | 121 | 
    Static4D tmp = quatMultiply(quatInverted,vector);  | 
| ... | ... | |
| 393 | 393 | 
    Static2D rot = mMovement.newRotation(rotatedTouchPoint2);  | 
| 394 | 394 | 
    RubikCube cube = mRenderer.getCube();  | 
| 395 | 395 | 
     | 
| 396 | 
                                               cube.addNewRotation( (int)rot.get1(), (int)(cube.getSize()*rot.get2()) );
   | 
|
| 396 | 
                                               cube.addNewRotation( (int)rot.get0(), (int)(cube.getSize()*rot.get1()) );
   | 
|
| 397 | 397 | 
     | 
| 398 | 398 | 
    mBeginningRotation = false;  | 
| 399 | 399 | 
    mContinuingRotation= true;  | 
| src/main/java/org/distorted/object/RubikCube.java | ||
|---|---|---|
| 104 | 104 | 
          {
   | 
| 105 | 105 | 
    Static4D quat = mQuatScramble[i][j][k];  | 
| 106 | 106 | 
     | 
| 107 | 
          float x = quat.get1();
   | 
|
| 108 | 
          float y = quat.get2();
   | 
|
| 109 | 
          float z = quat.get3();
   | 
|
| 110 | 
          float w = quat.get4();
   | 
|
| 107 | 
          float x = quat.get0();
   | 
|
| 108 | 
          float y = quat.get1();
   | 
|
| 109 | 
          float z = quat.get2();
   | 
|
| 110 | 
          float w = quat.get3();
   | 
|
| 111 | 111 | 
    float diff;  | 
| 112 | 112 | 
     | 
| 113 | 113 | 
    for(float legal: LEGAL)  | 
| ... | ... | |
| 177 | 177 | 
          {
   | 
| 178 | 178 | 
    switch(vector)  | 
| 179 | 179 | 
            {
   | 
| 180 | 
            case VECTX: return mCurrentPosition[x][y][z].get1()==row;
   | 
|
| 181 | 
            case VECTY: return mCurrentPosition[x][y][z].get2()==row;
   | 
|
| 182 | 
            case VECTZ: return mCurrentPosition[x][y][z].get3()==row;
   | 
|
| 180 | 
            case VECTX: return mCurrentPosition[x][y][z].get0()==row;
   | 
|
| 181 | 
            case VECTY: return mCurrentPosition[x][y][z].get1()==row;
   | 
|
| 182 | 
            case VECTZ: return mCurrentPosition[x][y][z].get2()==row;
   | 
|
| 183 | 183 | 
    }  | 
| 184 | 184 | 
     | 
| 185 | 185 | 
    return false;  | 
| ... | ... | |
| 191 | 191 | 
          {
   | 
| 192 | 192 | 
    Static3D current = mCurrentPosition[x][y][z];  | 
| 193 | 193 | 
    float diff = 0.5f*(mSize-1);  | 
| 194 | 
          float cubitCenterX = current.get1() - diff;
   | 
|
| 195 | 
          float cubitCenterY = current.get2() - diff;
   | 
|
| 196 | 
          float cubitCenterZ = current.get3() - diff;
   | 
|
| 194 | 
          float cubitCenterX = current.get0() - diff;
   | 
|
| 195 | 
          float cubitCenterY = current.get1() - diff;
   | 
|
| 196 | 
          float cubitCenterZ = current.get2() - diff;
   | 
|
| 197 | 197 | 
     | 
| 198 | 198 | 
    Static4D cubitCenter = new Static4D(cubitCenterX, cubitCenterY, cubitCenterZ, 0);  | 
| 199 | 199 | 
    Static4D rotatedCenter = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat);  | 
| 200 | 200 | 
     | 
| 201 | 
          float rotatedX = rotatedCenter.get1() + diff;
   | 
|
| 202 | 
          float rotatedY = rotatedCenter.get2() + diff;
   | 
|
| 203 | 
          float rotatedZ = rotatedCenter.get3() + diff;
   | 
|
| 201 | 
          float rotatedX = rotatedCenter.get0() + diff;
   | 
|
| 202 | 
          float rotatedY = rotatedCenter.get1() + diff;
   | 
|
| 203 | 
          float rotatedZ = rotatedCenter.get2() + diff;
   | 
|
| 204 | 204 | 
     | 
| 205 | 205 | 
    int roundedX = (int)(rotatedX+0.1f);  | 
| 206 | 206 | 
    int roundedY = (int)(rotatedY+0.1f);  | 
| 207 | 207 | 
    int roundedZ = (int)(rotatedZ+0.1f);  | 
| 208 | 208 | 
     | 
| 209 | 
          mCurrentPosition[x][y][z].set1(roundedX);
   | 
|
| 210 | 
          mCurrentPosition[x][y][z].set2(roundedY);
   | 
|
| 211 | 
          mCurrentPosition[x][y][z].set3(roundedZ);
   | 
|
| 209 | 
          mCurrentPosition[x][y][z].set0(roundedX);
   | 
|
| 210 | 
          mCurrentPosition[x][y][z].set1(roundedY);
   | 
|
| 211 | 
          mCurrentPosition[x][y][z].set2(roundedZ);
   | 
|
| 212 | 212 | 
    }  | 
| 213 | 213 | 
     | 
| 214 | 214 | 
    ///////////////////////////////////////////////////////////////////////////////////////////////////  | 
| ... | ... | |
| 342 | 342 | 
    mRotAxis = vector;  | 
| 343 | 343 | 
    mRotRow = row;  | 
| 344 | 344 | 
     | 
| 345 | 
          mRotationAngleStatic.set1(0.0f);
   | 
|
| 345 | 
          mRotationAngleStatic.set0(0.0f);
   | 
|
| 346 | 346 | 
     | 
| 347 | 347 | 
    for(int x=0; x<mSize; x++)  | 
| 348 | 348 | 
    for(int y=0; y<mSize; y++)  | 
| ... | ... | |
| 361 | 361 | 
     | 
| 362 | 362 | 
    public void continueRotation(float angleInDegrees)  | 
| 363 | 363 | 
          {
   | 
| 364 | 
          mRotationAngleStatic.set1(angleInDegrees);
   | 
|
| 364 | 
          mRotationAngleStatic.set0(angleInDegrees);
   | 
|
| 365 | 365 | 
    }  | 
| 366 | 366 | 
     | 
| 367 | 367 | 
    ///////////////////////////////////////////////////////////////////////////////////////////////////  | 
| ... | ... | |
| 394 | 394 | 
     | 
| 395 | 395 | 
    if( pointNum>=1 )  | 
| 396 | 396 | 
                        {
   | 
| 397 | 
                        float startingAngle = mRotationAngle[x][y][z].getPoint(pointNum-1).get1();
   | 
|
| 397 | 
                        float startingAngle = mRotationAngle[x][y][z].getPoint(pointNum-1).get0();
   | 
|
| 398 | 398 | 
    int nearestAngleInDegrees = computeNearestAngle(startingAngle);  | 
| 399 | 
                        mRotationAngleStatic.set1(startingAngle);
   | 
|
| 400 | 
                        mRotationAngleFinal.set1(nearestAngleInDegrees);
   | 
|
| 401 | 
                        mRotationAngleMiddle.set1( nearestAngleInDegrees + (nearestAngleInDegrees-startingAngle)*0.2f );
   | 
|
| 399 | 
                        mRotationAngleStatic.set0(startingAngle);
   | 
|
| 400 | 
                        mRotationAngleFinal.set0(nearestAngleInDegrees);
   | 
|
| 401 | 
                        mRotationAngleMiddle.set0( nearestAngleInDegrees + (nearestAngleInDegrees-startingAngle)*0.2f );
   | 
|
| 402 | 402 | 
    }  | 
| 403 | 403 | 
    else  | 
| 404 | 404 | 
                        {
   | 
| ... | ... | |
| 562 | 562 | 
          {
   | 
| 563 | 563 | 
    Static4D q = mQuatScramble[0][0][0];  | 
| 564 | 564 | 
     | 
| 565 | 
          float x = q.get1();
   | 
|
| 566 | 
          float y = q.get2();
   | 
|
| 567 | 
          float z = q.get3();
   | 
|
| 568 | 
          float w = q.get4();
   | 
|
| 565 | 
          float x = q.get0();
   | 
|
| 566 | 
          float y = q.get1();
   | 
|
| 567 | 
          float z = q.get2();
   | 
|
| 568 | 
          float w = q.get3();
   | 
|
| 569 | 569 | 
     | 
| 570 | 570 | 
    for(int i = 0; i< mSize; i++)  | 
| 571 | 571 | 
    for(int j = 0; j< mSize; j++)  | 
| ... | ... | |
| 575 | 575 | 
                  {
   | 
| 576 | 576 | 
    q = mQuatScramble[i][j][k];  | 
| 577 | 577 | 
     | 
| 578 | 
                  if( q.get1()!=x || q.get2()!=y || q.get3()!=z || q.get4()!=w )
   | 
|
| 578 | 
                  if( q.get0()!=x || q.get1()!=y || q.get2()!=z || q.get3()!=w )
   | 
|
| 579 | 579 | 
                    {
   | 
| 580 | 580 | 
    return false;  | 
| 581 | 581 | 
    }  | 
| ... | ... | |
| 610 | 610 | 
    mRotAxis = vector;  | 
| 611 | 611 | 
    mRotRow = row;  | 
| 612 | 612 | 
     | 
| 613 | 
          mRotationAngleStatic.set1(0.0f);
   | 
|
| 613 | 
          mRotationAngleStatic.set0(0.0f);
   | 
|
| 614 | 614 | 
     | 
| 615 | 615 | 
    for(int x=0; x<mSize; x++)  | 
| 616 | 616 | 
    for(int y=0; y<mSize; y++)  | 
| ... | ... | |
| 666 | 666 | 
     | 
| 667 | 667 | 
    if( pointNum>=1 )  | 
| 668 | 668 | 
                        {
   | 
| 669 | 
                        float startingAngle = mRotationAngle[x][y][z].getPoint(pointNum-1).get1();
   | 
|
| 669 | 
                        float startingAngle = mRotationAngle[x][y][z].getPoint(pointNum-1).get0();
   | 
|
| 670 | 670 | 
    int nearestAngleInDegrees = computeNearestAngle(startingAngle);  | 
| 671 | 671 | 
    double nearestAngleInRadians = nearestAngleInDegrees*Math.PI/180;  | 
| 672 | 672 | 
    float sinA =-(float)Math.sin(nearestAngleInRadians*0.5);  | 
| ... | ... | |
| 687 | 687 | 
    }  | 
| 688 | 688 | 
    }  | 
| 689 | 689 | 
     | 
| 690 | 
          mRotationAngleStatic.set1(0);
   | 
|
| 690 | 
          mRotationAngleStatic.set0(0);
   | 
|
| 691 | 691 | 
    }  | 
| 692 | 692 | 
    }  | 
| src/main/java/org/distorted/object/RubikCubeMovement.java | ||
|---|---|---|
| 160 | 160 | 
          {
   | 
| 161 | 161 | 
    float cubeHalfSize= RubikCube.CUBE_SCREEN_RATIO*0.5f;  | 
| 162 | 162 | 
     | 
| 163 | 
          mPoint[0]  = rotatedTouchPoint.get1();
   | 
|
| 164 | 
          mPoint[1]  = rotatedTouchPoint.get2();
   | 
|
| 165 | 
          mPoint[2]  = rotatedTouchPoint.get3();
   | 
|
| 163 | 
          mPoint[0]  = rotatedTouchPoint.get0();
   | 
|
| 164 | 
          mPoint[1]  = rotatedTouchPoint.get1();
   | 
|
| 165 | 
          mPoint[2]  = rotatedTouchPoint.get2();
   | 
|
| 166 | 166 | 
     | 
| 167 | 
          mCamera[0] = rotatedCamera.get1();
   | 
|
| 168 | 
          mCamera[1] = rotatedCamera.get2();
   | 
|
| 169 | 
          mCamera[2] = rotatedCamera.get3();
   | 
|
| 167 | 
          mCamera[0] = rotatedCamera.get0();
   | 
|
| 168 | 
          mCamera[1] = rotatedCamera.get1();
   | 
|
| 169 | 
          mCamera[2] = rotatedCamera.get2();
   | 
|
| 170 | 170 | 
     | 
| 171 | 171 | 
    for( mLastTouchedFace=FRONT; mLastTouchedFace<=BOTTOM; mLastTouchedFace++)  | 
| 172 | 172 | 
            {
   | 
| ... | ... | |
| 192 | 192 | 
          {
   | 
| 193 | 193 | 
    float cubeHalfSize= RubikCube.CUBE_SCREEN_RATIO*0.5f;  | 
| 194 | 194 | 
     | 
| 195 | 
          mPoint[0] = rotatedTouchPoint.get1();
   | 
|
| 196 | 
          mPoint[1] = rotatedTouchPoint.get2();
   | 
|
| 197 | 
          mPoint[2] = rotatedTouchPoint.get3();
   | 
|
| 195 | 
          mPoint[0] = rotatedTouchPoint.get0();
   | 
|
| 196 | 
          mPoint[1] = rotatedTouchPoint.get1();
   | 
|
| 197 | 
          mPoint[2] = rotatedTouchPoint.get2();
   | 
|
| 198 | 198 | 
     | 
| 199 | 199 | 
    castTouchPointOntoFace(mLastTouchedFace,cubeHalfSize,mDiff);  | 
| 200 | 200 | 
     | 
| ... | ... | |
| 218 | 218 | 
     | 
| 219 | 219 | 
    public float continueRotation(Static4D rotatedTouchPoint)  | 
| 220 | 220 | 
          {
   | 
| 221 | 
          mDiff[0] = rotatedTouchPoint.get1()-mTouch[0];
   | 
|
| 222 | 
          mDiff[1] = rotatedTouchPoint.get2()-mTouch[1];
   | 
|
| 223 | 
          mDiff[2] = rotatedTouchPoint.get3()-mTouch[2];
   | 
|
| 221 | 
          mDiff[0] = rotatedTouchPoint.get0()-mTouch[0];
   | 
|
| 222 | 
          mDiff[1] = rotatedTouchPoint.get1()-mTouch[1];
   | 
|
| 223 | 
          mDiff[2] = rotatedTouchPoint.get2()-mTouch[2];
   | 
|
| 224 | 224 | 
     | 
| 225 | 225 | 
    int xAxis= retFaceXaxis(mLastTouchedFace);  | 
| 226 | 226 | 
    int yAxis= retFaceYaxis(mLastTouchedFace);  | 
Also available in: Unified diff
Adjustment to Static's API.