commit ee39837dde931a36197415a1c36b73fc717f0a89
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sun Sep 27 00:30:37 2020 +0100

    Progress with the Diamond. Everything working except for the isSolved(): turns out the center cubits can end up rotated along the face by multitudes of 120 degrees.

diff --git a/src/main/java/org/distorted/main/RubikSurfaceView.java b/src/main/java/org/distorted/main/RubikSurfaceView.java
index 66347bdf..967b72e7 100644
--- a/src/main/java/org/distorted/main/RubikSurfaceView.java
+++ b/src/main/java/org/distorted/main/RubikSurfaceView.java
@@ -459,18 +459,18 @@ public class RubikSurfaceView extends GLSurfaceView
       mStartRotX = x;
       mStartRotY = y;
 
+      TwistyObject object = mPreRender.getObject();
+      int size = object.getSize();
+
       Static4D touchPoint2 = new Static4D(x, y, 0, 0);
       Static4D rotatedTouchPoint2= rotateVectorByInvertedQuat(touchPoint2, mQuat);
-
-      Static2D res = mMovement.newRotation(rotatedTouchPoint2);
-      TwistyObject object = mPreRender.getObject();
+      Static2D res = mMovement.newRotation(size,rotatedTouchPoint2);
 
       mCurrentAxis = (int)res.get0();
-      float offset = res.get1();
-      mCurrentRow  = object.computeRowFromOffset(offset);
+      mCurrentRow  = (int)res.get1();
 
       computeCurrentAxis( mMovement.getCastedRotAxis(mCurrentAxis) );
-      mRotationFactor = object.returnRotationFactor(offset);
+      mRotationFactor = mMovement.returnRotationFactor(size,mCurrentRow);
 
       object.beginNewRotation( mCurrentAxis, mCurrentRow );
 
diff --git a/src/main/java/org/distorted/objects/Movement.java b/src/main/java/org/distorted/objects/Movement.java
index a5c80cd0..3e51610c 100644
--- a/src/main/java/org/distorted/objects/Movement.java
+++ b/src/main/java/org/distorted/objects/Movement.java
@@ -27,6 +27,10 @@ import org.distorted.library.type.Static4D;
 
 public abstract class Movement
   {
+  static final float SQ2 = (float)Math.sqrt(2);
+  static final float SQ3 = (float)Math.sqrt(3);
+  static final float SQ6 = (float)Math.sqrt(6);
+
   private int mLastTouchedFace, mNumFaceAxis;
   private float[] mPoint, mCamera, mTouch;
   private float[] mPoint2D, mMove2D;
@@ -40,6 +44,8 @@ public abstract class Movement
 
   abstract boolean isInsideFace(int face, float[] point);
   abstract void computeEnabledAxis(int face, float[] touchPoint, int[] enabledAxis);
+  abstract int computeRowFromOffset(int face, int size, float offset);
+  public abstract float returnRotationFactor(int size, int row);
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -60,8 +66,15 @@ public abstract class Movement
     mDistanceCenterFace3D = distance3D; // distance from the center of the object to each of its faces
     mDistanceCenterFace2D = distance2D; // distance from the center of a face to its edge
 
-    // mCastedRotAxis[1][2]{0,1} are the 2D coords of the 2nd rotAxis cast onto the face defined by the
-    // 1st faceAxis.
+    computeCastedAxis(rotAxis);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// mCastedRotAxis[1][2]{0,1} are the 2D coords of the 2nd rotAxis cast onto the face defined by the
+// 1st faceAxis.
+
+  private void computeCastedAxis(Static3D[] rotAxis)
+    {
     mCastedRotAxis   = new float[mNumFaceAxis][rotAxis.length][2];
     mCastedRotAxis4D = new Static4D[mNumFaceAxis][rotAxis.length];
 
@@ -79,9 +92,9 @@ public abstract class Movement
         convertTo2Dcoords( mPoint, mFaceAxis[face], mCastedRotAxis[face][casted]);
         normalize2D(mCastedRotAxis[face][casted]);
 
-        fx = faceAxis[face].get0();
-        fy = faceAxis[face].get1();
-        fz = faceAxis[face].get2();
+        fx = mFaceAxis[face].get0();
+        fy = mFaceAxis[face].get1();
+        fz = mFaceAxis[face].get2();
         f  = mPoint[0]*fx + mPoint[1]*fy + mPoint[2]*fz;
         mCastedRotAxis4D[face][casted] = new Static4D( mPoint[0]-f*fx, mPoint[1]-f*fy, mPoint[2]-f*fz, 0);
         }
@@ -263,7 +276,7 @@ public abstract class Movement
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-  public Static2D newRotation(Static4D rotatedTouchPoint)
+  public Static2D newRotation(int size, Static4D rotatedTouchPoint)
     {
     float objectRatio = TwistyObject.getObjectRatio();
 
@@ -280,8 +293,9 @@ public abstract class Movement
     computeEnabledAxis(mLastTouchedFace, mPoint2D, mEnabledRotAxis);
     int rotIndex = computeRotationIndex(mLastTouchedFace, mMove2D, mEnabledRotAxis);
     float offset = computeOffset(mPoint2D, mCastedRotAxis[mLastTouchedFace][rotIndex]);
+    int row      = computeRowFromOffset(mLastTouchedFace,size,offset);
 
-    return new Static2D(rotIndex,offset);
+    return new Static2D(rotIndex,row);
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/src/main/java/org/distorted/objects/MovementCube.java b/src/main/java/org/distorted/objects/MovementCube.java
index f3142a10..6d3a2ae7 100644
--- a/src/main/java/org/distorted/objects/MovementCube.java
+++ b/src/main/java/org/distorted/objects/MovementCube.java
@@ -42,6 +42,20 @@ class MovementCube extends Movement
     super(TwistyCube.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int computeRowFromOffset(int face, int size, float offset)
+    {
+    return (int)(size*offset);
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public float returnRotationFactor(int size, int row)
+    {
+    return 1.0f;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean isInsideFace(int face, float[] p)
diff --git a/src/main/java/org/distorted/objects/MovementDiamond.java b/src/main/java/org/distorted/objects/MovementDiamond.java
index cf053a15..da7c87c9 100644
--- a/src/main/java/org/distorted/objects/MovementDiamond.java
+++ b/src/main/java/org/distorted/objects/MovementDiamond.java
@@ -25,9 +25,6 @@ import org.distorted.library.type.Static3D;
 
 class MovementDiamond extends Movement
 {
-  private static final float SQ3 = (float)Math.sqrt(3);
-  private static final float SQ6 = (float)Math.sqrt(6);
-
   static final float DIST3D = SQ6/6;
   static final float DIST2D = SQ3/6;
 
@@ -46,6 +43,31 @@ class MovementDiamond extends Movement
     super(TwistyDiamond.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+// We have either one of the four faces (1,3,4,6) which, when the retAxis are cast onto it, they
+// point the right way (and so the triangle then spans from offset=-SQ3/6 to offset=+SQ3/3 with
+// midpoint at SQ3/12) or one of the other face when the cast rotAxis are the wrong way round (and
+// the triangle spans then from 0 to SQ3/2 with midpoint at SQ3/4).
+
+  int computeRowFromOffset(int face, int size, float offset)
+    {
+    if( face==1 || face==3 || face==4 || face==6 )
+      {
+      return offset<SQ3/12 ? 0:1;
+      }
+    else
+      {
+      return offset<SQ3/4  ? 0:1;
+      }
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public float returnRotationFactor(int size, int row)
+    {
+    return 1.0f;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean isInsideFace(int face, float[] p)
@@ -62,20 +84,12 @@ class MovementDiamond extends Movement
     {
     enabled[0] = 3;
 
-    switch(face)
+    switch(face/2)
       {
-      case 0:
-      case 1: enabled[1]=1; enabled[2]=2; enabled[3]=3;
-              break;
-      case 2:
-      case 3: enabled[1]=0; enabled[2]=2; enabled[3]=3;
-              break;
-      case 4:
-      case 5: enabled[1]=0; enabled[2]=1; enabled[3]=3;
-              break;
-      case 6:
-      case 7: enabled[1]=0; enabled[2]=1; enabled[3]=2;
-              break;
+      case 0: enabled[1]=1; enabled[2]=2; enabled[3]=3; break;
+      case 1: enabled[1]=0; enabled[2]=2; enabled[3]=3; break;
+      case 2: enabled[1]=0; enabled[2]=1; enabled[3]=3; break;
+      case 3: enabled[1]=0; enabled[2]=1; enabled[3]=2; break;
       }
     }
 }
diff --git a/src/main/java/org/distorted/objects/MovementDino.java b/src/main/java/org/distorted/objects/MovementDino.java
index e9187345..92fbbed4 100644
--- a/src/main/java/org/distorted/objects/MovementDino.java
+++ b/src/main/java/org/distorted/objects/MovementDino.java
@@ -42,6 +42,20 @@ class MovementDino extends Movement
     super(TwistyDino.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int computeRowFromOffset(int face, int size, float offset)
+    {
+    return offset<DIST2D ? 0:2;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public float returnRotationFactor(int size, int row)
+    {
+    return 1.0f;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // _____________
 // |  \  0  /  |
diff --git a/src/main/java/org/distorted/objects/MovementHelicopter.java b/src/main/java/org/distorted/objects/MovementHelicopter.java
index bcc58824..8ee298f3 100644
--- a/src/main/java/org/distorted/objects/MovementHelicopter.java
+++ b/src/main/java/org/distorted/objects/MovementHelicopter.java
@@ -42,6 +42,20 @@ class MovementHelicopter extends Movement
     super(TwistyHelicopter.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int computeRowFromOffset(int face, int size, float offset)
+    {
+    return offset<DIST2D ? 0:2;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public float returnRotationFactor(int size, int row)
+    {
+    return 1.0f;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // _____________
 // |     |     |
diff --git a/src/main/java/org/distorted/objects/MovementPyraminx.java b/src/main/java/org/distorted/objects/MovementPyraminx.java
index 781ea551..ae84bfc7 100644
--- a/src/main/java/org/distorted/objects/MovementPyraminx.java
+++ b/src/main/java/org/distorted/objects/MovementPyraminx.java
@@ -25,10 +25,6 @@ import org.distorted.library.type.Static3D;
 
 class MovementPyraminx extends Movement
 {
-  private static final float SQ2 = (float)Math.sqrt(2);
-  private static final float SQ3 = (float)Math.sqrt(3);
-  private static final float SQ6 = (float)Math.sqrt(6);
-
   static final float DIST3D = SQ6/12;
   static final float DIST2D = SQ3/6;
 
@@ -47,6 +43,20 @@ class MovementPyraminx extends Movement
     super(TwistyPyraminx.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int computeRowFromOffset(int face, int size, float offset)
+    {
+    return (int)(size*offset/(SQ6/3));
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public float returnRotationFactor(int size, int row)
+    {
+    return ((float)size)/(size-row);
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   boolean isInsideFace(int face, float[] p)
diff --git a/src/main/java/org/distorted/objects/MovementSkewb.java b/src/main/java/org/distorted/objects/MovementSkewb.java
index d9804ba2..9e3c3868 100644
--- a/src/main/java/org/distorted/objects/MovementSkewb.java
+++ b/src/main/java/org/distorted/objects/MovementSkewb.java
@@ -42,6 +42,20 @@ class MovementSkewb extends Movement
     super(TwistySkewb.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
     }
 
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  int computeRowFromOffset(int face, int size, float offset)
+    {
+    return offset<DIST2D ? 0:1;
+    }
+
+///////////////////////////////////////////////////////////////////////////////////////////////////
+
+  public float returnRotationFactor(int size, int row)
+    {
+    return 1.0f;
+    }
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 // _____________
 // |  \  0  /  |
diff --git a/src/main/java/org/distorted/objects/TwistyCube.java b/src/main/java/org/distorted/objects/TwistyCube.java
index 13e891f8..af339bac 100644
--- a/src/main/java/org/distorted/objects/TwistyCube.java
+++ b/src/main/java/org/distorted/objects/TwistyCube.java
@@ -390,20 +390,6 @@ class TwistyCube extends TwistyObject
     return 4;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int computeRowFromOffset(float offset)
-    {
-    return (int)(getSize()*offset);
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float returnRotationFactor(float offset)
-    {
-    return 1.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int randomizeNewRotAxis(Random rnd, int oldRotAxis)
diff --git a/src/main/java/org/distorted/objects/TwistyDiamond.java b/src/main/java/org/distorted/objects/TwistyDiamond.java
index bac6cd90..282ac8dd 100644
--- a/src/main/java/org/distorted/objects/TwistyDiamond.java
+++ b/src/main/java/org/distorted/objects/TwistyDiamond.java
@@ -558,20 +558,6 @@ public class TwistyDiamond extends TwistyObject
     return 3;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int computeRowFromOffset(float offset)
-    {
-    return offset<SQ3/12 ? 0:1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float returnRotationFactor(float offset)
-    {
-    return 1.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int randomizeNewRotAxis(Random rnd, int oldRotAxis)
diff --git a/src/main/java/org/distorted/objects/TwistyDino.java b/src/main/java/org/distorted/objects/TwistyDino.java
index fa366ee4..1d9754e6 100644
--- a/src/main/java/org/distorted/objects/TwistyDino.java
+++ b/src/main/java/org/distorted/objects/TwistyDino.java
@@ -413,20 +413,6 @@ public abstract class TwistyDino extends TwistyObject
     return 3;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int computeRowFromOffset(float offset)
-    {
-    return offset<0.5f ? 0:2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float returnRotationFactor(float offset)
-    {
-    return 1.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int randomizeNewRotAxis(Random rnd, int oldRotAxis)
diff --git a/src/main/java/org/distorted/objects/TwistyHelicopter.java b/src/main/java/org/distorted/objects/TwistyHelicopter.java
index 0e7c8d15..132b6f77 100644
--- a/src/main/java/org/distorted/objects/TwistyHelicopter.java
+++ b/src/main/java/org/distorted/objects/TwistyHelicopter.java
@@ -621,20 +621,6 @@ public class TwistyHelicopter extends TwistyObject
     return 2;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int computeRowFromOffset(float offset)
-    {
-    return offset<0.166f ? 0:2;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float returnRotationFactor(float offset)
-    {
-    return 1.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int randomizeNewRotAxis(Random rnd, int oldRotAxis)
diff --git a/src/main/java/org/distorted/objects/TwistyObject.java b/src/main/java/org/distorted/objects/TwistyObject.java
index 02b88dd3..8a4ce705 100644
--- a/src/main/java/org/distorted/objects/TwistyObject.java
+++ b/src/main/java/org/distorted/objects/TwistyObject.java
@@ -710,8 +710,6 @@ public abstract class TwistyObject extends DistortedNode
   public abstract boolean isSolved();
   public abstract Static3D[] getRotationAxis();
   public abstract int getBasicAngle();
-  public abstract int computeRowFromOffset(float offset);
-  public abstract float returnRotationFactor(float offset);
   public abstract String retObjectString();
   public abstract int randomizeNewRotAxis(Random rnd, int oldRotAxis);
   public abstract int randomizeNewRow(Random rnd, int oldRotAxis, int oldRow, int newRotAxis);
diff --git a/src/main/java/org/distorted/objects/TwistyPyraminx.java b/src/main/java/org/distorted/objects/TwistyPyraminx.java
index 7841c727..65fd2078 100644
--- a/src/main/java/org/distorted/objects/TwistyPyraminx.java
+++ b/src/main/java/org/distorted/objects/TwistyPyraminx.java
@@ -492,23 +492,6 @@ public class TwistyPyraminx extends TwistyObject
     return 3;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int computeRowFromOffset(float offset)
-    {
-    return (int)(getSize()*offset/(SQ6/3));
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float returnRotationFactor(float offset)
-    {
-    int size = getSize();
-    int row  = (int)(size*offset/(SQ3/2));
-
-    return ((float)size)/(size-row);
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int randomizeNewRotAxis(Random rnd, int oldRotAxis)
diff --git a/src/main/java/org/distorted/objects/TwistySkewb.java b/src/main/java/org/distorted/objects/TwistySkewb.java
index 15eecc60..7f106487 100644
--- a/src/main/java/org/distorted/objects/TwistySkewb.java
+++ b/src/main/java/org/distorted/objects/TwistySkewb.java
@@ -565,20 +565,6 @@ public class TwistySkewb extends TwistyObject
     return 3;
     }
 
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public int computeRowFromOffset(float offset)
-    {
-    return offset<0.25f ? 0:1;
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
-
-  public float returnRotationFactor(float offset)
-    {
-    return 1.0f;
-    }
-
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
   public int randomizeNewRotAxis(Random rnd, int oldRotAxis)
