Revision 3ee79c9c
Added by Leszek Koltunski over 1 year ago
src/main/java/org/distorted/objectlib/tablebases/TablebasesCreator.java | ||
---|---|---|
256 | 256 |
|
257 | 257 |
insertingLevel++; |
258 | 258 |
|
259 |
android.util.Log.e("D", "inserted "+numInserted+" positions at level "+insertingLevel); |
|
259 |
// android.util.Log.e("D", "inserted "+numInserted+" positions at level "+insertingLevel);
|
|
260 | 260 |
} |
261 | 261 |
while( numInserted>0 ); |
262 | 262 |
} |
263 |
|
|
264 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
265 |
|
|
266 |
private void setupMove(int[] move, int axis, int layer, int angle) |
|
267 |
{ |
|
268 |
int maxAngle = mAngles[axis][layer]; |
|
269 |
angle = maxAngle-angle; |
|
270 |
if( angle> 0.5f*maxAngle ) angle -= maxAngle; |
|
271 |
|
|
272 |
move[0] = axis; |
|
273 |
move[1] = (1<<layer); |
|
274 |
move[2] = angle; |
|
275 |
} |
|
276 |
|
|
277 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
278 |
|
|
279 |
public int[][] solution(int index) |
|
280 |
{ |
|
281 |
byte level = mTablebase.retrieveUnpacked(index); |
|
282 |
int[][] moves = level>0 ? new int[level][3] : null; |
|
283 |
int currMove = 0; |
|
284 |
int quatBasis = 0; |
|
285 |
int[] quats = getQuats(index); |
|
286 |
int numQuats = quats.length; |
|
287 |
int[] tmpQuats = new int[numQuats]; |
|
288 |
boolean[] belongs = new boolean[mNumCubits]; |
|
289 |
|
|
290 |
while(level>0) |
|
291 |
{ |
|
292 |
for(int ax=0; ax<mNumAxis; ax++) |
|
293 |
{ |
|
294 |
int numLayers = mNumLayers[ax]; |
|
295 |
int[] angles = mAngles[ax]; |
|
296 |
|
|
297 |
for(int layer=0; layer<numLayers; layer++) |
|
298 |
{ |
|
299 |
if( !mRotatable[ax][layer] ) continue; |
|
300 |
int bitLayer = (1<<layer); |
|
301 |
|
|
302 |
for(int cubit=0; cubit<mNumCubits; cubit++) |
|
303 |
{ |
|
304 |
mRotRow[cubit][ax] = computeRow(mPosition[cubit],quats[cubit],ax); |
|
305 |
belongs[cubit] = belongsToMove(cubit,ax,bitLayer); |
|
306 |
} |
|
307 |
|
|
308 |
int maxAngle = angles[layer]; |
|
309 |
|
|
310 |
for(int angle=1; angle<maxAngle; angle++ ) |
|
311 |
{ |
|
312 |
System.arraycopy(quats, 0, tmpQuats, 0, numQuats); |
|
313 |
int quat = quatBasis + angle; |
|
314 |
|
|
315 |
for(int cubit=0; cubit<mNumCubits; cubit++) |
|
316 |
if( belongs[cubit] ) |
|
317 |
{ |
|
318 |
int currQuat = tmpQuats[cubit]; |
|
319 |
int newQuat = getMultQuat(quat,currQuat); |
|
320 |
tmpQuats[cubit] = newQuat; |
|
321 |
} |
|
322 |
|
|
323 |
int childIndex = getIndex(tmpQuats); |
|
324 |
byte newLevel = mTablebase.retrieveUnpacked(childIndex); |
|
325 |
|
|
326 |
if( newLevel==level-1 ) |
|
327 |
{ |
|
328 |
setupMove(moves[currMove],ax,layer,angle); |
|
329 |
currMove++; |
|
330 |
|
|
331 |
angle=maxAngle; |
|
332 |
layer=numLayers; |
|
333 |
ax=mNumAxis; |
|
334 |
index = childIndex; |
|
335 |
level = newLevel; |
|
336 |
} |
|
337 |
} |
|
338 |
} |
|
339 |
|
|
340 |
quatBasis += (angles[0]-1); |
|
341 |
} |
|
342 |
|
|
343 |
quatBasis = 0; |
|
344 |
quats = getQuats(index); |
|
345 |
} |
|
346 |
|
|
347 |
return moves; |
|
348 |
} |
|
263 | 349 |
} |
Also available in: Unified diff
Pyraminx Duo solver: solutions (coming from unpacked DB recreated each time) seem to be working.