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 |
}
|
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)