Project

General

Profile

« Previous | Next » 

Revision 398f2870

Added by Leszek Koltunski about 1 year ago

CU_323 solver: corrections.

View differences:

src/main/java/org/distorted/objectlib/tablebases/TBCuboid323.java
188 188
    if( axis==2 && layer==2 ) mFixedEdgeIsDown = !mFixedEdgeIsDown;
189 189
    if( axis==1 )
190 190
      {
191
      if( angle==3 ) angle=-1;
192

  
191 193
      if( layer==0 &&  mFixedEdgeIsDown ) return new int[] { axis, 2, angle };
192 194
      if( layer==1 && !mFixedEdgeIsDown ) return new int[] { axis, 1, angle };
193 195
      }
......
195 197
    int maxAngle = mAngles[axis][layer];
196 198
    angle = maxAngle-angle;
197 199
    if( angle> 0.5f*maxAngle ) angle -= maxAngle;
200

  
198 201
    return new int[] { axis, (1<<layer), angle };
199 202
    }
200 203

  
......
243 246

  
244 247
///////////////////////////////////////////////////////////////////////////////////////////////////
245 248

  
246
  private int findIndex(int[] table, int value)
249
  private static int findIndex(int[] table, int value)
247 250
    {
248 251
    for(int i=0; i<8; i++)
249 252
      if( table[i]==value ) return i;
......
260 263

  
261 264
///////////////////////////////////////////////////////////////////////////////////////////////////
262 265

  
263
  private void correctQuats(int[] quats)
266
  private void normalizeQuats(int[] quats)
264 267
    {
265 268
    int mult=0;
266 269

  
......
275 278
    for(int i=0; i<16; i++) quats[i] = getMultQuat(mult,quats[i]);
276 279
    }
277 280

  
281
///////////////////////////////////////////////////////////////////////////////////////////////////
282

  
283
  public static int[] quatsFromPermutations(int[] corner, int[] edge8)
284
    {
285
    int[] quats = new int[18];
286

  
287
    for(int i=0; i<8; i++)
288
      {
289
      int q = CORNER_MAP[i][corner[i]];
290
      quats[i] = q;
291
      }
292
    for(int i=0; i<8; i++)
293
      {
294
      int q = EDGE_MAP[i][edge8[i]];
295
      quats[i+8] = q;
296
      }
297

  
298
    return quats;
299
    }
300

  
301
///////////////////////////////////////////////////////////////////////////////////////////////////
302

  
303
  public static void cornerFromQuats(int[] corner_perm, int[] quats)
304
    {
305
    for(int i=0; i<8; i++) corner_perm[i] = findIndex( CORNER_MAP[i], quats[i]);
306
    }
307

  
308
///////////////////////////////////////////////////////////////////////////////////////////////////
309

  
310
  public static void edgeFromQuats(int[] edge_perm, int[] quats)
311
    {
312
    for(int i=0; i<8; i++) edge_perm[i] = findIndex( EDGE_MAP[i], quats[i+8]);
313
    }
314

  
278 315
///////////////////////////////////////////////////////////////////////////////////////////////////
279 316

  
280 317
  public int[] getQuats(int index)
......
295 332
TablebaseHelpers.displayTable(edge_perm7, "EDGE7");
296 333
android.util.Log.e("D", "inPlace="+inPlace);
297 334
*/
298
    int[] quats = new int[18];
299 335

  
300
    for(int i=0; i<8; i++)
301
      {
302
      int q = CORNER_MAP[i][corner_perm[i]];
303
      quats[i] = q;
304
      }
305
    for(int i=0; i<8; i++)
306
      {
307
      int q = EDGE_MAP[i][edge_perm8[i]];
308
      quats[i+8] = q;
309
      }
310

  
311
    return quats;
336
    return quatsFromPermutations(corner_perm,edge_perm8);
312 337
    }
313 338

  
314 339
///////////////////////////////////////////////////////////////////////////////////////////////////
315 340

  
316 341
  public int getIndex(int[] quats)
317 342
    {
343
    normalizeQuats(quats);
344

  
318 345
    int[] corner_perm = new int[8];
346
    cornerFromQuats(corner_perm,quats);
319 347
    int[] edge_perm8  = new int[8];
320

  
321
    correctQuats(quats);
322

  
323
    for(int i=0; i<8; i++)
324
      {
325
      corner_perm[i] = findIndex( CORNER_MAP[i], quats[i  ]);
326
      edge_perm8[i]  = findIndex( EDGE_MAP[i]  , quats[i+8]);
327
      }
328

  
329
    int[] edge_perm7 = edgePermTo7(edge_perm8);
348
    edgeFromQuats(edge_perm8,quats);
349
    int[] edge_perm7  = edgePermTo7(edge_perm8);
330 350

  
331 351
    int corner_perm_num = TablebaseHelpers.computePermutationNum(corner_perm);
332 352
    int edge_perm_num = TablebaseHelpers.computePermutationNum(edge_perm7);
src/main/java/org/distorted/objectlib/tablebases/TablebasesAbstract.java
166 166
///////////////////////////////////////////////////////////////////////////////////////////////////
167 167
// remember about the double cover or unit quaternions!
168 168

  
169
  private int mulQuat(int q1, int q2)
169
  public static int mulQuat(int q1, int q2, Static4D[] quats)
170 170
    {
171
    Static4D result = QuatHelper.quatMultiply(mQuats[q1],mQuats[q2]);
171
    int numQuats = quats.length;
172
    Static4D result = QuatHelper.quatMultiply(quats[q1],quats[q2]);
172 173

  
173 174
    float rX = result.get0();
174 175
    float rY = result.get1();
......
178 179
    final float MAX_ERROR = 0.1f;
179 180
    float dX,dY,dZ,dW;
180 181

  
181
    for(int i=0; i<mNumQuats; i++)
182
    for(int i=0; i<numQuats; i++)
182 183
      {
183
      dX = mQuats[i].get0() - rX;
184
      dY = mQuats[i].get1() - rY;
185
      dZ = mQuats[i].get2() - rZ;
186
      dW = mQuats[i].get3() - rW;
184
      dX = quats[i].get0() - rX;
185
      dY = quats[i].get1() - rY;
186
      dZ = quats[i].get2() - rZ;
187
      dW = quats[i].get3() - rW;
187 188

  
188 189
      if( dX<MAX_ERROR && dX>-MAX_ERROR &&
189 190
          dY<MAX_ERROR && dY>-MAX_ERROR &&
190 191
          dZ<MAX_ERROR && dZ>-MAX_ERROR &&
191 192
          dW<MAX_ERROR && dW>-MAX_ERROR  ) return i;
192 193

  
193
      dX = mQuats[i].get0() + rX;
194
      dY = mQuats[i].get1() + rY;
195
      dZ = mQuats[i].get2() + rZ;
196
      dW = mQuats[i].get3() + rW;
194
      dX = quats[i].get0() + rX;
195
      dY = quats[i].get1() + rY;
196
      dZ = quats[i].get2() + rZ;
197
      dW = quats[i].get3() + rW;
197 198

  
198 199
      if( dX<MAX_ERROR && dX>-MAX_ERROR &&
199 200
          dY<MAX_ERROR && dY>-MAX_ERROR &&
......
218 219

  
219 220
    if( index1<mNumQuats && index2<mNumQuats )
220 221
      {
221
      if( mQuatMult[index1][index2]==-1 ) mQuatMult[index1][index2] = mulQuat(index1,index2);
222
      if( mQuatMult[index1][index2]==-1 ) mQuatMult[index1][index2] = mulQuat(index1,index2, mQuats);
222 223
      return mQuatMult[index1][index2];
223 224
      }
224 225

  

Also available in: Unified diff