Revision 4946b635
Added by Leszek Koltunski about 3 years ago
src/main/java/org/distorted/main/RubikSurfaceView.java | ||
---|---|---|
394 | 394 |
|
395 | 395 |
Static4D touchPoint2 = new Static4D(x, y, 0, 0); |
396 | 396 |
Static4D rotatedTouchPoint2= QuatHelper.rotateVectorByInvertedQuat(touchPoint2, mQuat); |
397 |
Static2D res = mMovement.newRotation(numLayers,rotatedTouchPoint2,object.getObjectRatio());
|
|
397 |
Static2D res = mMovement.newRotation(rotatedTouchPoint2,object.getObjectRatio()); |
|
398 | 398 |
|
399 | 399 |
mCurrentAxis = (int)res.get0(); |
400 | 400 |
mCurrentRow = (int)res.get1(); |
src/main/java/org/distorted/objects/Movement.java | ||
---|---|---|
34 | 34 |
private final float[] mPoint, mCamera, mTouch; |
35 | 35 |
private final float[] mPoint2D, mMove2D; |
36 | 36 |
private final int[] mEnabledRotAxis; |
37 |
private final float mDistanceCenterFace3D, mDistanceCenterFace2D;
|
|
37 |
private final float mDistanceCenterFace3D; |
|
38 | 38 |
private final Static3D[] mFaceAxis; |
39 | 39 |
|
40 | 40 |
private int mLastTouchedFace; |
41 | 41 |
private float[][][] mCastedRotAxis; |
42 | 42 |
private Static4D[][] mCastedRotAxis4D; |
43 |
private float[][] mTouchBorders, mA, mB; |
|
43 | 44 |
|
44 | 45 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
45 | 46 |
|
46 | 47 |
abstract boolean isInsideFace(int face, float[] point); |
47 | 48 |
abstract void computeEnabledAxis(int face, float[] touchPoint, int[] enabledAxis); |
48 |
abstract int computeRowFromOffset(int face, int axisIndex, int numLayers, float offset); |
|
49 | 49 |
public abstract float returnRotationFactor(int numLayers, int row); |
50 | 50 |
|
51 | 51 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
52 | 52 |
|
53 |
Movement(Static3D[] rotAxis, Static3D[] faceAxis, float distance3D, float distance2D)
|
|
53 |
Movement(Static3D[] rotAxis, Static3D[] faceAxis, float[][] cuts, boolean[][] rotatable, float distance3D, int size)
|
|
54 | 54 |
{ |
55 | 55 |
mPoint = new float[3]; |
56 | 56 |
mCamera= new float[3]; |
... | ... | |
65 | 65 |
mEnabledRotAxis = new int[rotAxis.length+1]; |
66 | 66 |
|
67 | 67 |
mDistanceCenterFace3D = distance3D; // distance from the center of the object to each of its faces |
68 |
mDistanceCenterFace2D = distance2D; // distance from the center of a face to its edge |
|
69 | 68 |
|
70 | 69 |
computeCastedAxis(rotAxis); |
70 |
computeBorders(cuts,rotatable,size); |
|
71 |
computeLinear(distance3D,rotAxis,faceAxis); |
|
71 | 72 |
} |
72 | 73 |
|
73 | 74 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
249 | 250 |
|
250 | 251 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
251 | 252 |
|
252 |
float[] computeBorder(float scale, float[] cuts, boolean[] rotatable)
|
|
253 |
private float[] computeBorder(float[] cuts, boolean[] rotatable, int size)
|
|
253 | 254 |
{ |
254 | 255 |
int len = cuts.length; |
255 | 256 |
float[] border = new float[len]; |
... | ... | |
262 | 263 |
} |
263 | 264 |
else |
264 | 265 |
{ |
265 |
if( rotatable[i+1] ) border[i] = scale*cuts[i];
|
|
266 |
if( rotatable[i+1] ) border[i] = cuts[i]/size;
|
|
266 | 267 |
else |
267 | 268 |
{ |
268 | 269 |
int found = -1; |
... | ... | |
276 | 277 |
} |
277 | 278 |
} |
278 | 279 |
|
279 |
border[i] = found>0 ? scale*(cuts[i]+cuts[found-1])/2 : Float.MAX_VALUE;
|
|
280 |
border[i] = found>0 ? (cuts[i]+cuts[found-1])/(2*size) : Float.MAX_VALUE;
|
|
280 | 281 |
} |
281 | 282 |
} |
282 | 283 |
} |
... | ... | |
285 | 286 |
} |
286 | 287 |
|
287 | 288 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
289 |
// size, not numLayers (see Master Skewb where size!=numLayers) |
|
288 | 290 |
|
289 |
float[][] computeBorders(float coeff, float[][] cuts, boolean[][] rotatable)
|
|
291 |
void computeBorders(float[][] cuts, boolean[][] rotatable, int size)
|
|
290 | 292 |
{ |
291 | 293 |
int numCuts = cuts.length; |
292 |
float[][] borders = new float[numCuts][];
|
|
294 |
mTouchBorders = new float[numCuts][];
|
|
293 | 295 |
|
294 | 296 |
for(int i=0; i<numCuts; i++) |
295 | 297 |
{ |
296 |
borders[i] = computeBorder(coeff,cuts[i],rotatable[i]); |
|
298 |
mTouchBorders[i] = computeBorder(cuts[i],rotatable[i],size); |
|
299 |
} |
|
300 |
} |
|
301 |
|
|
302 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
303 |
|
|
304 |
private int computeSign(Static3D a, Static3D b) |
|
305 |
{ |
|
306 |
float a1 = a.get0(); |
|
307 |
float a2 = a.get1(); |
|
308 |
float a3 = a.get2(); |
|
309 |
float b1 = b.get0(); |
|
310 |
float b2 = b.get1(); |
|
311 |
float b3 = b.get2(); |
|
312 |
|
|
313 |
return a1*b1+a2*b2+a3*b3 < 0 ? 1:-1; |
|
314 |
} |
|
315 |
|
|
316 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
317 |
|
|
318 |
private float crossProductLen(Static3D a, Static3D b) |
|
319 |
{ |
|
320 |
float a1 = a.get0(); |
|
321 |
float a2 = a.get1(); |
|
322 |
float a3 = a.get2(); |
|
323 |
float b1 = b.get0(); |
|
324 |
float b2 = b.get1(); |
|
325 |
float b3 = b.get2(); |
|
326 |
|
|
327 |
float x1 = a2*b3-a3*b2; |
|
328 |
float x2 = a3*b1-a1*b3; |
|
329 |
float x3 = a1*b2-a2*b1; |
|
330 |
|
|
331 |
return (float)Math.sqrt(x1*x1 + x2*x2 + x3*x3); |
|
332 |
} |
|
333 |
|
|
334 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
335 |
// compute the array of 'A' and 'B' coeffs of the Ax+B linear function by which we need to multiply |
|
336 |
// the 3D 'cuts' to translate it from 3D (i.e. with respect to the rotAxis) to 2D in-face (i.e. with |
|
337 |
// respect to the 2D rotAxis cast into a particular face) |
|
338 |
|
|
339 |
void computeLinear(float distance3D, Static3D[] rotAxis, Static3D[] faceAxis) |
|
340 |
{ |
|
341 |
int numFaces = faceAxis.length; |
|
342 |
int numRot = rotAxis.length; |
|
343 |
|
|
344 |
mA = new float[numFaces][numRot]; |
|
345 |
mB = new float[numFaces][numRot]; |
|
346 |
|
|
347 |
for(int i=0; i<numFaces; i++) |
|
348 |
for(int j=0; j<numRot; j++) |
|
349 |
{ |
|
350 |
mA[i][j] = crossProductLen(faceAxis[i],rotAxis[j]); |
|
351 |
|
|
352 |
if( mA[i][j]!=0.0f ) |
|
353 |
{ |
|
354 |
float coeff = (float)Math.sqrt(1/(mA[i][j]*mA[i][j]) -1); |
|
355 |
int sign = computeSign(faceAxis[i],rotAxis[j]); |
|
356 |
mB[i][j] = sign*distance3D*coeff; |
|
357 |
} |
|
358 |
else mB[i][j] = 0.0f; |
|
359 |
|
|
360 |
android.util.Log.e("D", "face="+i+" rot="+j+" a="+mA[i][j]+" B="+mB[i][j]); |
|
361 |
} |
|
362 |
} |
|
363 |
|
|
364 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
365 |
|
|
366 |
private int computeRowFromOffset(int face, int axisIndex, float offset) |
|
367 |
{ |
|
368 |
float[] borders = mTouchBorders[axisIndex]; |
|
369 |
int len = borders.length; |
|
370 |
float A = mA[face][axisIndex]; |
|
371 |
|
|
372 |
if( A!=0.0f ) |
|
373 |
{ |
|
374 |
float B = mB[face][axisIndex]; |
|
375 |
|
|
376 |
for(int i=0; i<len; i++) |
|
377 |
{ |
|
378 |
float translated = B + borders[i]/A; |
|
379 |
|
|
380 |
android.util.Log.e("D", "offset="+offset+" borders[i]="+borders[i]+" translated="+translated+" A="+A+" B="+B); |
|
381 |
|
|
382 |
if( offset<translated ) return i; |
|
383 |
} |
|
297 | 384 |
} |
298 | 385 |
|
299 |
return borders;
|
|
386 |
return len;
|
|
300 | 387 |
} |
301 | 388 |
|
302 | 389 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
328 | 415 |
|
329 | 416 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
330 | 417 |
|
331 |
public Static2D newRotation(int numLayers, Static4D rotatedTouchPoint, float objectRatio)
|
|
418 |
public Static2D newRotation(Static4D rotatedTouchPoint, float objectRatio) |
|
332 | 419 |
{ |
333 | 420 |
mPoint[0] = rotatedTouchPoint.get0()/objectRatio; |
334 | 421 |
mPoint[1] = rotatedTouchPoint.get1()/objectRatio; |
... | ... | |
343 | 430 |
computeEnabledAxis(mLastTouchedFace, mPoint2D, mEnabledRotAxis); |
344 | 431 |
int rotIndex = computeRotationIndex(mLastTouchedFace, mMove2D, mEnabledRotAxis); |
345 | 432 |
float offset = computeOffset(mPoint2D, mCastedRotAxis[mLastTouchedFace][rotIndex]); |
346 |
int row = computeRowFromOffset(mLastTouchedFace,rotIndex,numLayers,offset);
|
|
433 |
int row = computeRowFromOffset(mLastTouchedFace,rotIndex,offset); |
|
347 | 434 |
|
348 | 435 |
return new Static2D(rotIndex,row); |
349 | 436 |
} |
src/main/java/org/distorted/objects/Movement12.java | ||
---|---|---|
51 | 51 |
new Static3D(-SIN54/LEN, 0 , -C2/LEN ) |
52 | 52 |
}; |
53 | 53 |
|
54 |
private final float[][] mTouchBorders; |
|
55 |
|
|
56 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
57 |
|
|
58 |
Movement12(Static3D[] rotAxis,float[][] cuts, boolean[][] rotatable, int numLayers) |
|
59 |
{ |
|
60 |
super(rotAxis, FACE_AXIS, DIST3D, DIST2D); |
|
61 |
float scale = (DIST2D*(1.5f)/(2*DIST3D))/numLayers; // SQ5/2 is 1/cos(dihedral-90) |
|
62 |
mTouchBorders = computeBorders(scale,cuts,rotatable); |
|
63 |
} |
|
64 |
|
|
65 | 54 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
66 | 55 |
|
67 |
int computeRowFromOffset(int face, int axisIndex, int numLayers, float offset)
|
|
56 |
Movement12(Static3D[] rotAxis,float[][] cuts, boolean[][] rotatable, int size)
|
|
68 | 57 |
{ |
69 |
float[] borders = mTouchBorders[axisIndex]; |
|
70 |
int len = borders.length; |
|
71 |
|
|
72 |
for(int i=0; i<len; i++) |
|
73 |
{ |
|
74 |
if( offset<borders[i] ) return i; |
|
75 |
} |
|
76 |
|
|
77 |
return len; |
|
58 |
super(rotAxis, FACE_AXIS, cuts,rotatable,DIST3D, size); |
|
78 | 59 |
} |
79 | 60 |
|
80 | 61 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/Movement4.java | ||
---|---|---|
39 | 39 |
new Static3D(+SQ6/3,-SQ3/3, 0), |
40 | 40 |
}; |
41 | 41 |
|
42 |
private final float[][] mTouchBorders; |
|
43 |
|
|
44 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
45 |
|
|
46 |
Movement4(Static3D[] rotAxis,float[][] cuts, boolean[][] rotatable,int numLayers) |
|
47 |
{ |
|
48 |
super(rotAxis, FACE_AXIS, DIST3D, DIST2D); |
|
49 |
float scale = (3*SQ2/4)/numLayers; // 3*SQ2/4 is height(face)/height(tetra) |
|
50 |
mTouchBorders = computeBorders(scale,cuts,rotatable); |
|
51 |
} |
|
52 |
|
|
53 | 42 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
54 | 43 |
|
55 |
int computeRowFromOffset(int face, int axisIndex, int numLayers, float offset)
|
|
44 |
Movement4(Static3D[] rotAxis,float[][] cuts, boolean[][] rotatable, int size)
|
|
56 | 45 |
{ |
57 |
float[] borders = mTouchBorders[axisIndex]; |
|
58 |
int len = borders.length; |
|
59 |
|
|
60 |
for(int i=0; i<len; i++) |
|
61 |
{ |
|
62 |
if( offset<borders[i] ) return i; |
|
63 |
} |
|
64 |
|
|
65 |
return len; |
|
46 |
super(rotAxis, FACE_AXIS, cuts, rotatable, DIST3D, size); |
|
66 | 47 |
} |
67 | 48 |
|
68 | 49 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/Movement6.java | ||
---|---|---|
38 | 38 |
new Static3D(0,0,1), new Static3D(0,0,-1) |
39 | 39 |
}; |
40 | 40 |
|
41 |
private final float[][] mTouchBorders; |
|
42 |
|
|
43 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
44 |
|
|
45 |
Movement6(Static3D[] rotAxis,float[][] cuts, boolean[][] rotatable, int numLayers) |
|
46 |
{ |
|
47 |
super(rotAxis, FACE_AXIS, DIST3D, DIST2D); |
|
48 |
float scale = 1.0f/numLayers; // 1.0 is (2*DIST3D)/(2*DIST2D) |
|
49 |
mTouchBorders = computeBorders(scale,cuts,rotatable); |
|
50 |
} |
|
51 |
|
|
52 | 41 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
53 | 42 |
|
54 |
int computeRowFromOffset(int face, int axisIndex, int numLayers, float offset)
|
|
43 |
Movement6(Static3D[] rotAxis,float[][] cuts, boolean[][] rotatable, int size)
|
|
55 | 44 |
{ |
56 |
float[] borders = mTouchBorders[axisIndex]; |
|
57 |
int len = borders.length; |
|
58 |
|
|
59 |
for(int i=0; i<len; i++) |
|
60 |
{ |
|
61 |
if( offset<borders[i] ) return i; |
|
62 |
} |
|
63 |
|
|
64 |
return len; |
|
45 |
super(rotAxis, FACE_AXIS, cuts, rotatable, DIST3D, size); |
|
65 | 46 |
} |
66 | 47 |
|
67 | 48 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/Movement8.java | ||
---|---|---|
39 | 39 |
new Static3D( 0,+SQ3/3,-SQ6/3), new Static3D( 0,-SQ3/3,+SQ6/3) |
40 | 40 |
}; |
41 | 41 |
|
42 |
private final float[][] mTouchBorders; |
|
43 |
|
|
44 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
45 |
|
|
46 |
Movement8(Static3D[] rotAxis,float[][] cuts, boolean[][] rotatable, int numLayers) |
|
47 |
{ |
|
48 |
super(rotAxis, FACE_AXIS, DIST3D, DIST2D); |
|
49 |
float scale = (3*SQ2/4)/numLayers; // 3*SQ2/4 is 1/cos(dihedral-90) |
|
50 |
mTouchBorders = computeBorders(scale,cuts,rotatable); |
|
51 |
} |
|
52 |
|
|
53 | 42 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
54 |
// We have either one of the four faces (1,3,4,6) which, when the retAxis are cast onto it, they |
|
55 |
// point the right way (and so the triangle then spans from offset=-SQ3/6 to offset=+SQ3/3 with |
|
56 |
// midpoint at SQ3/12) or one of the other face when the cast rotAxis are the wrong way round (and |
|
57 |
// the triangle spans then from 0 to SQ3/2 with midpoint at SQ3/4). |
|
58 |
// |
|
59 |
// This is only true if the rotAxis connect the centers of opposing faces! |
|
60 | 43 |
|
61 |
int computeRowFromOffset(int face, int axisIndex, int numLayers, float offset)
|
|
44 |
Movement8(Static3D[] rotAxis,float[][] cuts, boolean[][] rotatable, int size)
|
|
62 | 45 |
{ |
63 |
float off = ( face==1 || face==3 || face==4 || face==6 ) ? DIST2D/2 : -DIST2D/2; |
|
64 |
float[] borders = mTouchBorders[axisIndex]; |
|
65 |
int len = borders.length; |
|
66 |
|
|
67 |
for(int i=0; i<len; i++) |
|
68 |
{ |
|
69 |
if( offset+off<borders[i] ) return i; |
|
70 |
} |
|
71 |
|
|
72 |
return len; |
|
46 |
super(rotAxis, FACE_AXIS, cuts, rotatable, DIST3D, size); |
|
73 | 47 |
} |
74 | 48 |
|
75 | 49 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementCornerTwisting.java | ||
---|---|---|
35 | 35 |
|
36 | 36 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
37 | 37 |
|
38 |
MovementCornerTwisting(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
38 |
MovementCornerTwisting(float[][] cuts, boolean[][] rotatable,int size)
|
|
39 | 39 |
{ |
40 |
super(TwistySkewb.ROT_AXIS,cuts,rotatable,numLayers);
|
|
40 |
super(TwistySkewb.ROT_AXIS,cuts,rotatable,size);
|
|
41 | 41 |
} |
42 | 42 |
|
43 | 43 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementCube.java | ||
---|---|---|
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
32 | 32 |
|
33 |
MovementCube(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
33 |
MovementCube(float[][] cuts, boolean[][] rotatable, int size)
|
|
34 | 34 |
{ |
35 |
super(TwistyCube.ROT_AXIS,cuts,rotatable,numLayers);
|
|
35 |
super(TwistyCube.ROT_AXIS,cuts,rotatable,size);
|
|
36 | 36 |
} |
37 | 37 |
|
38 | 38 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementDiamond.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
class MovementDiamond extends Movement8 |
25 | 25 |
{ |
26 |
MovementDiamond(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
26 |
MovementDiamond(float[][] cuts, boolean[][] rotatable, int size)
|
|
27 | 27 |
{ |
28 |
super(TwistyDiamond.ROT_AXIS,cuts,rotatable, numLayers);
|
|
28 |
super(TwistyDiamond.ROT_AXIS,cuts,rotatable,size);
|
|
29 | 29 |
} |
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementHelicopter.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
class MovementHelicopter extends Movement6 |
25 | 25 |
{ |
26 |
MovementHelicopter(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
26 |
MovementHelicopter(float[][] cuts, boolean[][] rotatable, int size)
|
|
27 | 27 |
{ |
28 |
super(TwistyHelicopter.ROT_AXIS,cuts,rotatable, numLayers);
|
|
28 |
super(TwistyHelicopter.ROT_AXIS,cuts,rotatable,size);
|
|
29 | 29 |
} |
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementIvy.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
class MovementIvy extends Movement6 |
25 | 25 |
{ |
26 |
MovementIvy(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
26 |
MovementIvy(float[][] cuts, boolean[][] rotatable, int size)
|
|
27 | 27 |
{ |
28 |
super(TwistyIvy.ROT_AXIS,cuts,rotatable,numLayers);
|
|
28 |
super(TwistyIvy.ROT_AXIS,cuts,rotatable,size);
|
|
29 | 29 |
} |
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementJing.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
class MovementJing extends Movement4 |
25 | 25 |
{ |
26 |
MovementJing(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
26 |
MovementJing(float[][] cuts, boolean[][] rotatable, int size)
|
|
27 | 27 |
{ |
28 |
super(TwistyJing.ROT_AXIS,cuts,rotatable,numLayers);
|
|
28 |
super(TwistyJing.ROT_AXIS,cuts,rotatable,size);
|
|
29 | 29 |
} |
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementMinx.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
class MovementMinx extends Movement12 |
25 | 25 |
{ |
26 |
MovementMinx(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
26 |
MovementMinx(float[][] cuts, boolean[][] rotatable, int size)
|
|
27 | 27 |
{ |
28 |
super(TwistyMinx.ROT_AXIS,cuts,rotatable,numLayers);
|
|
28 |
super(TwistyMinx.ROT_AXIS,cuts,rotatable,size);
|
|
29 | 29 |
} |
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementPyraminx.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
class MovementPyraminx extends Movement4 |
25 | 25 |
{ |
26 |
MovementPyraminx(float[][] cuts, boolean[][] rotatable,int numLayers)
|
|
26 |
MovementPyraminx(float[][] cuts, boolean[][] rotatable, int size)
|
|
27 | 27 |
{ |
28 |
super(TwistyPyraminx.ROT_AXIS,cuts,rotatable,numLayers);
|
|
28 |
super(TwistyPyraminx.ROT_AXIS,cuts,rotatable,size);
|
|
29 | 29 |
} |
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementSquare.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
class MovementSquare extends Movement6 |
25 | 25 |
{ |
26 |
MovementSquare(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
26 |
MovementSquare(float[][] cuts, boolean[][] rotatable, int size)
|
|
27 | 27 |
{ |
28 |
super(TwistySquare.ROT_AXIS,cuts,rotatable,numLayers);
|
|
28 |
super(TwistySquare.ROT_AXIS,cuts,rotatable,size);
|
|
29 | 29 |
} |
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/MovementUltimate.java | ||
---|---|---|
23 | 23 |
|
24 | 24 |
class MovementUltimate extends Movement12 |
25 | 25 |
{ |
26 |
MovementUltimate(float[][] cuts, boolean[][] rotatable, int numLayers)
|
|
26 |
MovementUltimate(float[][] cuts, boolean[][] rotatable, int size)
|
|
27 | 27 |
{ |
28 |
super(TwistyUltimate.ROT_AXIS,cuts,rotatable,numLayers);
|
|
28 |
super(TwistyUltimate.ROT_AXIS,cuts,rotatable,size);
|
|
29 | 29 |
} |
30 | 30 |
|
31 | 31 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/objects/TwistyPyraminx.java | ||
---|---|---|
222 | 222 |
|
223 | 223 |
for(int i=0; i<numLayers-1; i++) |
224 | 224 |
{ |
225 |
float cut = (1.0f+i-numLayers/3.0f)*(SQ6/3);
|
|
225 |
float cut = (1.0f+i-numLayers/4.0f)*(SQ6/3);
|
|
226 | 226 |
mCuts[0][i] = cut; |
227 | 227 |
mCuts[1][i] = cut; |
228 | 228 |
mCuts[2][i] = cut; |
src/main/java/org/distorted/objects/TwistySkewb.java | ||
---|---|---|
553 | 553 |
if( mCuts==null ) getCuts(numLayers); |
554 | 554 |
getLayerRotatable(numLayers); |
555 | 555 |
|
556 |
mMovement = new MovementCornerTwisting(mCuts,mLayerRotatable,numLayers);
|
|
556 |
mMovement = new MovementCornerTwisting(mCuts,mLayerRotatable,2*numLayers-2);
|
|
557 | 557 |
} |
558 | 558 |
return mMovement; |
559 | 559 |
} |
src/main/java/org/distorted/tutorials/TutorialSurfaceView.java | ||
---|---|---|
339 | 339 |
|
340 | 340 |
Static4D touchPoint2 = new Static4D(x, y, 0, 0); |
341 | 341 |
Static4D rotatedTouchPoint2= QuatHelper.rotateVectorByInvertedQuat(touchPoint2, mQuat); |
342 |
Static2D res = mMovement.newRotation(numLayers,rotatedTouchPoint2,object.getObjectRatio());
|
|
342 |
Static2D res = mMovement.newRotation(rotatedTouchPoint2,object.getObjectRatio()); |
|
343 | 343 |
|
344 | 344 |
mCurrentAxis = (int)res.get0(); |
345 | 345 |
mCurrentRow = (int)res.get1(); |
Also available in: Unified diff
Major abstraction - automatically compute the 'computeRowFromOffset()' function from CUTS.
Still one thing left: it appears like the CUTS of Mega/Kilominxes are not correct.