commit 12313693245ae0782fa0c9639ae5163f92337a6c
Author: Leszek Koltunski <leszek@koltunski.pl>
Date:   Sat Jan 2 00:03:44 2021 +0100

    Progress with the Kilominx movement (still not working)

diff --git a/src/main/java/org/distorted/objects/FactoryCubit.java b/src/main/java/org/distorted/objects/FactoryCubit.java
index 723210a9..08679ea4 100644
--- a/src/main/java/org/distorted/objects/FactoryCubit.java
+++ b/src/main/java/org/distorted/objects/FactoryCubit.java
@@ -45,9 +45,10 @@ class FactoryCubit
   private static final float SQ5 = (float)Math.sqrt(5);
   private static final float SQ6 = (float)Math.sqrt(6);
 
+  static final float SIN54   = (SQ5+1)/4;                         // sin(54 deg)
+  static final float COS54   = (float)(Math.sqrt(10-2*SQ5)/4);    // cos(54 deg)
+
   static final float MINX_C0 = (SQ5-1)/4;
-  static final float MINX_C1 = (SQ5+1)/4;                         // sin(54 deg)
-  static final float MINX_C3 = (float)(Math.sqrt(10-2*SQ5)/4);    // cos(54 deg)
   static final float MINX_C4 = (float)(Math.sqrt(0.5f-0.1f*SQ5)); // cos(half the dihedral angle)
   static final float MINX_C5 = (float)(Math.sqrt(0.5f+0.1f*SQ5)); // sin(half the dihedral angle)
   static final float MINX_SC = 0.5f;
@@ -692,7 +693,7 @@ class FactoryCubit
     float X1= (SQ5+1)/8;
     float Y1= (float)(Math.sqrt(2+0.4f*SQ5)/4);
     float Y2= Y1 - (float)(Math.sqrt(10-2*SQ5)/8);
-    float H = 0.5f*MINX_C1/MINX_C3;
+    float H = 0.5f* SIN54 /COS54  ;
     float X2= MINX_SC*H*MINX_C5;
     float Y3= MINX_SC*H/(2*MINX_C4);
     float Y4= MINX_SC*H*(1/(2*MINX_C4) - MINX_C4);
@@ -1221,7 +1222,7 @@ class FactoryCubit
     {
     VertexEffect[] effect = new VertexEffect[10];
 
-    float H = 0.5f*(MINX_C1/MINX_C3);
+    float H = 0.5f*(SIN54 /COS54  );
     float Y1= (float)(Math.sqrt(2+0.4f*SQ5)/4);
     float Y2= H/(2*MINX_C4);
     float A = (float)(Math.acos(-SQ5/5)*180/Math.PI);  // dihedral angle of a dedecahedron in degrees
@@ -1631,11 +1632,11 @@ class FactoryCubit
     VertexEffect[] effects = createVertexEffectsMinxCorner();
     for( VertexEffect effect : effects ) mesh.apply(effect);
 
-    float A = (2*SQ3/3)*MINX_C1;
+    float A = (2*SQ3/3)* SIN54;
     float B = 0.4f;
-    float X = MINX_C5*MINX_C1*MINX_C3;
-    float Y = MINX_C1*MINX_C1 - 0.5f;
-    float Z = MINX_C4*MINX_C1*MINX_C3;
+    float X = MINX_C5* SIN54 *COS54  ;
+    float Y = SIN54 * SIN54 - 0.5f;
+    float Z = MINX_C4* SIN54 *COS54  ;
 
     Static3D center = new Static3D(0.0f, -(float)Math.sqrt(1-A*A)*B,-A*B);
 
diff --git a/src/main/java/org/distorted/objects/Movement.java b/src/main/java/org/distorted/objects/Movement.java
index 3e51610c..40ca94db 100644
--- a/src/main/java/org/distorted/objects/Movement.java
+++ b/src/main/java/org/distorted/objects/Movement.java
@@ -27,18 +27,19 @@ 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;
+  private final int mNumFaceAxis;
+  private final float[] mPoint, mCamera, mTouch;
+  private final float[] mPoint2D, mMove2D;
+  private final int[] mEnabledRotAxis;
+  private final float mDistanceCenterFace3D, mDistanceCenterFace2D;
+  private final Static3D[] mFaceAxis;
+
+  private int mLastTouchedFace;
   private float[][][] mCastedRotAxis;
   private Static4D[][] mCastedRotAxis4D;
-  private int[] mEnabledRotAxis;
-  private float mDistanceCenterFace3D, mDistanceCenterFace2D;
-  private Static3D[] mFaceAxis;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/src/main/java/org/distorted/objects/MovementMinx.java b/src/main/java/org/distorted/objects/MovementMinx.java
index 2381efe6..f5e68949 100644
--- a/src/main/java/org/distorted/objects/MovementMinx.java
+++ b/src/main/java/org/distorted/objects/MovementMinx.java
@@ -20,19 +20,34 @@
 package org.distorted.objects;
 
 import org.distorted.library.type.Static3D;
+import static org.distorted.objects.TwistyMinx.C1;
+import static org.distorted.objects.TwistyMinx.C2;
+import static org.distorted.objects.TwistyMinx.LEN;
+import static org.distorted.objects.FactoryCubit.SIN54;
+import static org.distorted.objects.FactoryCubit.COS54;
+import static org.distorted.objects.TwistyObject.SQ5;
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
 class MovementMinx extends Movement
 {
-  static final float DIST3D = 0.25f;
-  static final float DIST2D = 0.25f;
+  static final float DIST3D = (float)Math.sqrt(0.625f+0.275f*SQ5)/3;
+  static final float DIST2D = (0.5f*SIN54/COS54)/3;
 
   static final Static3D[] FACE_AXIS = new Static3D[]
          {
-           new Static3D(1,0,0), new Static3D(-1,0,0),
-           new Static3D(0,1,0), new Static3D(0,-1,0),
-           new Static3D(0,0,1), new Static3D(0,0,-1)
+           new Static3D( C2/LEN, C1/LEN, 0      ),
+           new Static3D( C2/LEN,-C1/LEN, 0      ),
+           new Static3D(-C2/LEN, C1/LEN, 0      ),
+           new Static3D(-C2/LEN,-C1/LEN, 0      ),
+           new Static3D( 0     , C2/LEN, C1/LEN ),
+           new Static3D( 0     , C2/LEN,-C1/LEN ),
+           new Static3D( 0     ,-C2/LEN, C1/LEN ),
+           new Static3D( 0     ,-C2/LEN,-C1/LEN ),
+           new Static3D( C1/LEN, 0     , C2/LEN ),
+           new Static3D( C1/LEN, 0     ,-C2/LEN ),
+           new Static3D(-C1/LEN, 0     , C2/LEN ),
+           new Static3D(-C1/LEN, 0     ,-C2/LEN )
          };
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -46,7 +61,7 @@ class MovementMinx extends Movement
 
   int computeRowFromOffset(int face, int size, float offset)
     {
-    return offset<DIST2D ? 0:1;
+    return offset<DIST2D ? 0:2;
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -57,42 +72,33 @@ class MovementMinx extends Movement
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// faces 0,1,2,3  --> /
-// faces 4,5      --> \
-
-  private boolean isTopHalf(int face, float[] touchPoint)
-    {
-    if( face==4 || face==5 ) return touchPoint[1] >=-touchPoint[0];
-    else                     return touchPoint[1] >= touchPoint[0];
-    }
-
-///////////////////////////////////////////////////////////////////////////////////////////////////
+// TODO; approximation
 
   boolean isInsideFace(int face, float[] p)
     {
-    return ( p[0]<=DIST2D && p[0]>=-DIST2D && p[1]<=DIST2D && p[1]>=-DIST2D );
+    return ( p[0]*p[0] + p[1]*p[1] <= 1/(4*COS54*COS54) );
     }
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
-// 0 +++
-// 1 ++-
-// 2 +-+
-// 3 +--
 
   void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
     {
-    enabled[0] = 1;
-
-    boolean isTop = isTopHalf(face,touchPoint);
+    enabled[0] = 5;
 
     switch(face)
       {
-      case 0: enabled[1] = isTop ? 0:3; break;
-      case 1: enabled[1] = isTop ? 2:1; break;
-      case 2: enabled[1] = isTop ? 2:0; break;
-      case 3: enabled[1] = isTop ? 1:3; break;
-      case 4: enabled[1] = isTop ? 0:1; break;
-      case 5: enabled[1] = isTop ? 2:3; break;
+      case  0:
+      case  3:  enabled[1]=1; enabled[2]=2; enabled[3]=3; enabled[4]=4; enabled[5]=5; break;
+      case  1:
+      case  2:  enabled[1]=0; enabled[2]=2; enabled[3]=3; enabled[4]=4; enabled[5]=5; break;
+      case  4:
+      case  7:  enabled[1]=0; enabled[2]=1; enabled[3]=3; enabled[4]=4; enabled[5]=5; break;
+      case  5:
+      case  6:  enabled[1]=0; enabled[2]=1; enabled[3]=2; enabled[4]=4; enabled[5]=5; break;
+      case  8:
+      case 11:  enabled[1]=0; enabled[2]=1; enabled[3]=2; enabled[4]=3; enabled[5]=5; break;
+      case  9:
+      case 10:  enabled[1]=0; enabled[2]=1; enabled[3]=2; enabled[4]=3; enabled[5]=4; break;
       }
     }
 }
