Project

General

Profile

« Previous | Next » 

Revision b4111717

Added by Leszek Koltunski over 1 year ago

Pyraminx Duo solver: creation of unpacked DB should be working; at least it does create the correct number of each 'level' states in case of Pyraminx Duo (correct i.e. the same as given by Jaap)

View differences:

src/main/java/org/distorted/objectlib/tablebases/TablebasesCreator.java
31 31
  private final float[][] mPosition;
32 32
  private final float[][] mCuts;
33 33
  private final int[] mNumCuts;
34
  private final boolean[][] mRotatable;
35

  
34 36
  private int[][] mQuatMult;
35 37

  
38
  private static final float[] mTmp = new float[4];
39

  
36 40
///////////////////////////////////////////////////////////////////////////////////////////////////
37 41

  
38
  abstract int getSize();
39 42
  abstract int[][] getBasicAngles();
40 43
  abstract Static3D[] getRotationAxis();
41
  abstract int[] getQuats(int index);
42
  abstract int getIndex(int[] quats);
43 44
  abstract float[][] getPosition();
44 45
  abstract float[][] getCuts();
45 46

  
47
  abstract boolean[][] getRotatable();
48

  
49
  abstract int getSize();
50
  abstract int[] getQuats(int index);
51
  abstract int getIndex(int[] quats);
52

  
46 53
///////////////////////////////////////////////////////////////////////////////////////////////////
47 54

  
48 55
  public TablebasesCreator()
......
57 64
    mNumQuats = mQuats.length;
58 65
    mPosition = getPosition();
59 66
    mNumCubits = mPosition.length;
60

  
67
    mRotatable = getRotatable();
61 68
    mCuts = getCuts();
62 69
    mNumCuts = new int[mNumAxis];
63 70

  
......
67 74
      }
68 75

  
69 76
    mRotRow = new int[mNumCubits][mNumAxis];
70

  
71
    for(int i=0; i<mNumCubits; i++)
72
      for(int j=0; j<mNumAxis; j++)
73
        {
74
        mRotRow[i][j] = computeRow(mPosition[i],j);
75
        }
76 77
    }
77 78

  
78 79
///////////////////////////////////////////////////////////////////////////////////////////////////
79 80

  
80
  private int computeRow(float[] pos, int axisIndex)
81
  private int computeRow(float[] pos, int quat, int axisIndex)
81 82
    {
82 83
    int ret=0;
83 84
    int len = pos.length/3;
......
86 87
    float axisY = axis.get1();
87 88
    float axisZ = axis.get2();
88 89
    float casted, xoff=0, yoff=0, zoff=0;
90
    Static4D q = mQuats[quat];
89 91

  
90 92
    for(int i=0; i<len; i++)
91 93
      {
92
      casted = (pos[3*i]+xoff)*axisX + (pos[3*i+1]+yoff)*axisY + (pos[3*i+2]+zoff)*axisZ;
94
      QuatHelper.rotateVectorByQuat(mTmp,pos[3*i],pos[3*i+1],pos[3*i+2],1.0f,q);
95
      casted = (mTmp[0]+xoff)*axisX + (mTmp[1]+yoff)*axisY + (mTmp[2]+zoff)*axisZ;
93 96
      ret |= computeSingleRow(axisIndex,casted);
94 97
      }
95 98

  
......
169 172
      return mQuatMult[index1][index2];
170 173
      }
171 174

  
172

  
173
android.util.Log.e("D", "error in getMulQuat: index1="+index1+" index2="+index2+" numQuats="+mNumQuats);
174

  
175

  
176 175
    return -2;
177 176
    }
178 177

  
......
200 199
      {
201 200
      for(int layer=0; layer<mNumLayers[ax]; layer++)
202 201
        {
202
        if( !mRotatable[ax][layer] ) continue;
203
        int bitLayer = (1<<layer);
204

  
203 205
        for(int cubit=0; cubit<mNumCubits; cubit++)
204
          belongs[cubit] = belongsToMove(cubit,ax,layer);
206
          {
207
          mRotRow[cubit][ax] = computeRow(mPosition[cubit],quats[cubit],ax);
208
          belongs[cubit] = belongsToMove(cubit,ax,bitLayer);
209
          }
205 210

  
206 211
        int maxAngle = mAngles[ax][layer];
207 212

  
......
214 219
            if( belongs[cubit] )
215 220
              {
216 221
              int currQuat = tmpQuats[cubit];
217
              int newQuat = getMultQuat(currQuat,quat);
222
              int newQuat = getMultQuat(quat,currQuat);
218 223
              tmpQuats[cubit] = newQuat;
219 224
              }
220 225

  
221
android.util.Log.e("D", "quat: "+quat+" numAxis="+mNumAxis+" numLayers="+mNumLayers[ax]+" maxAngle="+maxAngle);
222

  
223 226
          int childIndex = getIndex(tmpQuats);
224 227
          if( mTablebase.insertUnpacked(childIndex,newLevel) ) ret++;
225 228
          }
src/main/java/org/distorted/objectlib/tablebases/TablebasesPyraminxDuo.java
57 57
    return new float[][] { cut,cut,cut,cut };
58 58
    }
59 59

  
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61

  
62
  boolean[][] getRotatable()
63
    {
64
    boolean[] tmp = new boolean[] {false,true};
65
    return new boolean[][] { tmp,tmp,tmp,tmp };
66
    }
67

  
60 68
///////////////////////////////////////////////////////////////////////////////////////////////////
61 69
// specifically for the tablebase
62 70
///////////////////////////////////////////////////////////////////////////////////////////////////
......
82 90
    switch(c)
83 91
      {
84 92
      case 0: quats[4] = 2; break;
85
      case 1: quats[4] = 3; break;
93
      case 1: quats[4] = 5; break;
86 94
      case 2: quats[4] = 4; break;
87
      case 3: quats[4] = 5; break;
95
      case 3: quats[4] = 3; break;
88 96
      }
89 97

  
90 98
    switch(b3)
......
145 153
    switch(quats[4])
146 154
      {
147 155
      case  0: case  1: case  2: c=0; break;
148
      case  3: case  6: case  9: c=1; break;
156
      case  5: case  8: case 10: c=1; break;
149 157
      case  4: case  7: case 11: c=2; break;
150
      case  5: case  8: case 10: c=3; break;
158
      case  3: case  6: case  9: c=3; break;
151 159
      }
152 160

  
153
    int ret = c + 4*(b3 + 3*(b2 + 3*(b1 + 3*b0)));
154

  
155
    return ret;
161
    return c + 4*(b3 + 3*(b2 + 3*(b1 + 3*b0)));
156 162
    }
157 163
}  
158 164

  

Also available in: Unified diff