Revision 8be29dfc
Added by Leszek Koltunski about 5 years ago
src/main/java/org/distorted/examples/rubik/RubikSurfaceView.java | ||
---|---|---|
51 | 51 |
|
52 | 52 |
private boolean mDragging, mRotating; |
53 | 53 |
private int mX, mY; |
54 |
private int mTouchedRow, mTouchedCol, mTouchedSli; |
|
55 | 54 |
private Static4D mQuatCurrent, mQuatAccumulated; |
56 | 55 |
private int mRotationVect; |
57 | 56 |
private RubikRenderer mRenderer; |
... | ... | |
106 | 105 |
|
107 | 106 |
if( mLastTouchedFace != NONE ) |
108 | 107 |
{ |
109 |
mRenderer.abortLastEffect(); |
|
110 |
mRenderer.applyNewEffect(mTouchedCol, mTouchedRow, mTouchedSli); |
|
111 | 108 |
mRotating = true; |
112 | 109 |
} |
113 | 110 |
else |
... | ... | |
127 | 124 |
if( (mX-x)*(mX-x)+(mY-y)*(mY-y)>minimumToRotate ) |
128 | 125 |
{ |
129 | 126 |
addNewRotation(x,y); |
127 |
mX = x; |
|
128 |
mY = y; |
|
130 | 129 |
mRotating = false; |
131 | 130 |
} |
132 | 131 |
} |
... | ... | |
207 | 206 |
{ |
208 | 207 |
fillTouchPoint(x,y); |
209 | 208 |
|
210 |
float angle=0.0f;
|
|
209 |
int sign=1;
|
|
211 | 210 |
float cubeHalfSize= mRenderer.returnCubeSize()*0.5f; |
212 | 211 |
float A=retA(mLastTouchedFace,cubeHalfSize); |
213 | 212 |
|
... | ... | |
219 | 218 |
{ |
220 | 219 |
case VECTX: switch(mLastTouchedFace) |
221 | 220 |
{ |
222 |
case FRONT : angle = returnAngle(-diffZ, diffY); break;
|
|
223 |
case BACK : angle = returnAngle( diffZ,-diffY); break;
|
|
224 |
case TOP : angle = returnAngle(-diffY,-diffZ); break;
|
|
225 |
case BOTTOM: angle = returnAngle( diffY, diffZ); break;
|
|
221 |
case FRONT : sign = returnSign(-diffY); break;
|
|
222 |
case BACK : sign = returnSign( diffY); break;
|
|
223 |
case TOP : sign = returnSign( diffZ); break;
|
|
224 |
case BOTTOM: sign = returnSign(-diffZ); break;
|
|
226 | 225 |
} |
227 | 226 |
break; |
228 | 227 |
case VECTY: switch(mLastTouchedFace) |
229 | 228 |
{ |
230 |
case FRONT : angle = returnAngle(-diffZ, diffX); break;
|
|
231 |
case BACK : angle = returnAngle( diffZ,-diffX); break;
|
|
232 |
case LEFT : angle = returnAngle( diffX, diffZ); break;
|
|
233 |
case RIGHT : angle = returnAngle(-diffX,-diffZ); break;
|
|
229 |
case FRONT : sign = returnSign( diffX); break;
|
|
230 |
case BACK : sign = returnSign(-diffX); break;
|
|
231 |
case LEFT : sign = returnSign( diffZ); break;
|
|
232 |
case RIGHT : sign = returnSign(-diffZ); break;
|
|
234 | 233 |
} |
235 | 234 |
break; |
236 | 235 |
case VECTZ: switch(mLastTouchedFace) |
237 | 236 |
{ |
238 |
case TOP : angle = returnAngle( diffY, diffX); break;
|
|
239 |
case BOTTOM: angle = returnAngle(-diffY,-diffX); break;
|
|
240 |
case LEFT : angle = returnAngle(-diffX, diffY); break;
|
|
241 |
case RIGHT : angle = returnAngle( diffX,-diffY); break;
|
|
237 |
case TOP : sign = returnSign(-diffX); break;
|
|
238 |
case BOTTOM: sign = returnSign( diffX); break;
|
|
239 |
case LEFT : sign = returnSign(-diffY); break;
|
|
240 |
case RIGHT : sign = returnSign( diffY); break;
|
|
242 | 241 |
} |
243 | 242 |
break; |
244 | 243 |
default : android.util.Log.e("View", "impossible vector: "+mRotationVect); |
245 | 244 |
} |
246 | 245 |
|
247 |
mRenderer.continueRotation(angle); |
|
246 |
float dX = mX-x; |
|
247 |
float dY = mY-y; |
|
248 |
float calibration = (float)Math.sqrt(dX*dX+dY*dY); |
|
249 |
|
|
250 |
mRenderer.continueRotation(calibration*sign); |
|
248 | 251 |
} |
249 | 252 |
|
250 | 253 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
258 | 261 |
|
259 | 262 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
260 | 263 |
|
261 |
private float returnAngle(float diff1, float diff2)
|
|
264 |
private int returnSign(float diff)
|
|
262 | 265 |
{ |
263 |
float len = (float)Math.sqrt(diff1*diff1 + diff2*diff2); |
|
264 |
len /= mRenderer.mScreenMin; |
|
265 |
|
|
266 |
return diff2>0 ? len : -len; |
|
266 |
return diff>0 ? 1 : -1; |
|
267 | 267 |
} |
268 | 268 |
|
269 | 269 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
277 | 277 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
278 | 278 |
// return quat1*quat2 |
279 | 279 |
|
280 |
private Static4D quatMultiply( Static4D quat1, Static4D quat2 )
|
|
280 |
static Static4D quatMultiply( Static4D quat1, Static4D quat2 )
|
|
281 | 281 |
{ |
282 | 282 |
float qx = quat1.get1(); |
283 | 283 |
float qy = quat1.get2(); |
... | ... | |
403 | 403 |
float qY= (mStartY+cubeHalfSize) / (2*cubeHalfSize); |
404 | 404 |
float qZ= (mStartZ+cubeHalfSize) / (2*cubeHalfSize); |
405 | 405 |
|
406 |
if( qX==1.0f ) qX-= 0.5f/RubikRenderer.NUM_CUBES; |
|
407 |
if( qY==1.0f ) qY-= 0.5f/RubikRenderer.NUM_CUBES; |
|
408 |
if( qZ==1.0f ) qZ-= 0.5f/RubikRenderer.NUM_CUBES; |
|
409 |
|
|
410 |
if( qX<1 && qX>=0 && qY<1 && qY>=0 && qZ<1 && qZ>=0 ) |
|
411 |
{ |
|
412 |
mTouchedCol = (int)(qX*RubikRenderer.NUM_CUBES); |
|
413 |
mTouchedRow = (int)(qY*RubikRenderer.NUM_CUBES); |
|
414 |
mTouchedSli = (int)(qZ*RubikRenderer.NUM_CUBES); |
|
415 |
return face; |
|
416 |
} |
|
406 |
if( qX<=1 && qX>=0 && qY<=1 && qY>=0 && qZ<=1 && qZ>=0 ) return face; |
|
417 | 407 |
} |
418 | 408 |
} |
419 | 409 |
|
420 |
mTouchedRow = -1; |
|
421 |
mTouchedCol = -1; |
|
422 |
mTouchedSli = -1; |
|
423 |
|
|
424 | 410 |
return NONE; |
425 | 411 |
} |
426 | 412 |
|
Also available in: Unified diff
Improve the Rubik App - beginnings of rotation.