Project

General

Profile

« Previous | Next » 

Revision 3ee79c9c

Added by Leszek Koltunski over 1 year ago

Pyraminx Duo solver: solutions (coming from unpacked DB recreated each time) seem to be working.

View differences:

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