Major abstraction - automatically compute the 'computeRowFromOffset()' function from CUTS.Still one thing left: it appears like the CUTS of Mega/Kilominxes are not correct.
Abstract the next function, computeRowFromOffset(), out of the individual Movement classes.Still two issues:
1) mysterious 1.5 multiplier in Movement122) 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.
Make computing the offset in the Movement class more correct. From now on, in the center of the face the offset if always 0 regardless of the axis.Before it would always assume that we can add DIST2D to the offset which is originated at the center of the face and this way get an offset which spans from 0 to height of the face. This is not always true - conterexample: half of the triangluar faces of an octahedron which are 'upside down'
Minor
Abstract out some methods from the Movement classes. only two remain now: rowFromOffset and enabledAxis.
On second thought, come back to Vector. The problem: before we had the potentially blocking function 'effectFinished' inside our synchronized block.
Convert Square-2 to the new generic scrambling algorithm.
In order to do it we need to introduce a third, artificial rotational axis - otherwise the algorithm would make it impossible to rotate the lower layer and immediatelly after - the upper.
Standarize the 'isSolved()' method: now all objects, except one (Dino4) have a standard isSolved().This incidentally also fixes detection of the solved state in case of Diamond4, i.e. a Master FTO.
Square-1: progress with movement.
Make it possible for an object to have different 'cuts' along each of its axis.
Square-1: beginnings