1
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
2
|
// Copyright 2023 Leszek Koltunski //
|
3
|
// //
|
4
|
// This file is part of Magic Cube. //
|
5
|
// //
|
6
|
// Magic Cube is proprietary software licensed under an EULA which you should have received //
|
7
|
// along with the code. If not, check https://distorted.org/magic/License-Magic-Cube.html //
|
8
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
9
|
|
10
|
package org.distorted.objectlib.tablebases;
|
11
|
|
12
|
import android.content.res.Resources;
|
13
|
|
14
|
import org.distorted.library.type.Static3D;
|
15
|
import static org.distorted.objectlib.main.TwistyObject.SQ3;
|
16
|
|
17
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
18
|
|
19
|
public class TablebasesIvyCube extends TablebasesAbstract
|
20
|
{
|
21
|
private static final int[] mTmp = new int[6];
|
22
|
|
23
|
private static final int[][] MAP = { {0,4,2,2,5,3,4,5,3,0,1,1},
|
24
|
{1,5,3,3,4,2,5,4,2,1,0,0},
|
25
|
{2,0,4,5,0,5,1,1,4,3,3,2},
|
26
|
{3,1,5,4,1,4,0,0,5,2,2,3},
|
27
|
{4,2,0,1,3,0,3,2,1,5,4,5},
|
28
|
{5,3,1,0,2,1,2,3,0,4,5,4} };
|
29
|
|
30
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
31
|
|
32
|
public TablebasesIvyCube()
|
33
|
{
|
34
|
super();
|
35
|
}
|
36
|
|
37
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
38
|
|
39
|
public TablebasesIvyCube(Resources res)
|
40
|
{
|
41
|
super(res,org.distorted.objectlib.R.raw.ivy_2_tablebase);
|
42
|
}
|
43
|
|
44
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
45
|
|
46
|
int[][] getBasicAngles()
|
47
|
{
|
48
|
int[] tmp = {3,3};
|
49
|
return new int[][] { tmp,tmp,tmp,tmp };
|
50
|
}
|
51
|
|
52
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
53
|
|
54
|
Static3D[] getRotationAxis()
|
55
|
{
|
56
|
return new Static3D[]
|
57
|
{
|
58
|
new Static3D( SQ3/3, SQ3/3, SQ3/3),
|
59
|
new Static3D( SQ3/3, SQ3/3,-SQ3/3),
|
60
|
new Static3D( SQ3/3,-SQ3/3, SQ3/3),
|
61
|
new Static3D( SQ3/3,-SQ3/3,-SQ3/3)
|
62
|
};
|
63
|
}
|
64
|
|
65
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
66
|
|
67
|
float[][] getPosition()
|
68
|
{
|
69
|
final float DIST_CORNER = 1;
|
70
|
final float DIST_CENTER = 1;
|
71
|
|
72
|
return new float[][]
|
73
|
{
|
74
|
{ DIST_CORNER, DIST_CORNER, DIST_CORNER },
|
75
|
{-DIST_CORNER, DIST_CORNER,-DIST_CORNER },
|
76
|
{-DIST_CORNER,-DIST_CORNER, DIST_CORNER },
|
77
|
{ DIST_CORNER,-DIST_CORNER,-DIST_CORNER },
|
78
|
{ DIST_CENTER, 0, 0 },
|
79
|
{-DIST_CENTER, 0, 0 },
|
80
|
{ 0, DIST_CENTER, 0 },
|
81
|
{ 0,-DIST_CENTER, 0 },
|
82
|
{ 0, 0, DIST_CENTER },
|
83
|
{ 0, 0,-DIST_CENTER },
|
84
|
};
|
85
|
}
|
86
|
|
87
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
88
|
|
89
|
float[][] getCuts()
|
90
|
{
|
91
|
float[] cut = { 0.0f };
|
92
|
return new float[][] { cut,cut,cut,cut };
|
93
|
}
|
94
|
|
95
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
96
|
|
97
|
boolean[][] getRotatable()
|
98
|
{
|
99
|
boolean[] tmp1 = new boolean[] {false,true};
|
100
|
boolean[] tmp2 = new boolean[] {true,false};
|
101
|
|
102
|
return new boolean[][] { tmp1,tmp2,tmp2,tmp1 };
|
103
|
}
|
104
|
|
105
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
106
|
// specifically for the tablebase
|
107
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
108
|
// orientations of 4 corners + any even permutation of 6 centers
|
109
|
|
110
|
int getSize()
|
111
|
{
|
112
|
return (3*3*3*3)*(6*5*4*3);
|
113
|
}
|
114
|
|
115
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
116
|
|
117
|
int getMinScramble()
|
118
|
{
|
119
|
return 7;
|
120
|
}
|
121
|
|
122
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
123
|
|
124
|
private int findFirst(int[] table, int value)
|
125
|
{
|
126
|
int len = table.length;
|
127
|
|
128
|
for(int i=0; i<len; i++)
|
129
|
if( table[i]==value ) return i;
|
130
|
|
131
|
return -1;
|
132
|
}
|
133
|
|
134
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
135
|
|
136
|
public int[] getQuats(int index)
|
137
|
{
|
138
|
int perm_num = index%360;
|
139
|
index /= 360;
|
140
|
int twist0 = index%3;
|
141
|
index /= 3;
|
142
|
int twist1 = index%3;
|
143
|
index /= 3;
|
144
|
int twist2 = index%3;
|
145
|
index /= 3;
|
146
|
int twist3 = index%3;
|
147
|
|
148
|
int[] ret = new int[10];
|
149
|
|
150
|
ret[0] = twist0==0 ? 0 : (twist0==1 ? 2:1);
|
151
|
ret[1] = twist1==0 ? 0 : (twist1==1 ? 5:6);
|
152
|
ret[2] = twist2==0 ? 0 : (twist2==1 ? 3:4);
|
153
|
ret[3] = twist3==0 ? 0 : (twist3==1 ? 8:7);
|
154
|
|
155
|
TablebaseHelpers.getEvenPermutationFromNum(mTmp,perm_num);
|
156
|
|
157
|
for(int i=0; i<6; i++)
|
158
|
{
|
159
|
int cubitThatMoves = mTmp[i];
|
160
|
ret[cubitThatMoves+4] = findFirst(MAP[cubitThatMoves],i);
|
161
|
}
|
162
|
|
163
|
return ret;
|
164
|
}
|
165
|
|
166
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
167
|
|
168
|
public int getIndex(int[] quats)
|
169
|
{
|
170
|
int twist0 = quats[0]==0 ? 0 : (quats[0]==1 ? 2:1);
|
171
|
int twist1 = quats[1]==0 ? 0 : (quats[1]==6 ? 2:1);
|
172
|
int twist2 = quats[2]==0 ? 0 : (quats[2]==4 ? 2:1);
|
173
|
int twist3 = quats[3]==0 ? 0 : (quats[3]==7 ? 2:1);
|
174
|
|
175
|
int c4 = MAP[0][quats[4]];
|
176
|
int c5 = MAP[1][quats[5]];
|
177
|
int c6 = MAP[2][quats[6]];
|
178
|
int c7 = MAP[3][quats[7]];
|
179
|
int c8 = MAP[4][quats[8]];
|
180
|
int c9 = MAP[5][quats[9]];
|
181
|
|
182
|
mTmp[c4]=0;
|
183
|
mTmp[c5]=1;
|
184
|
mTmp[c6]=2;
|
185
|
mTmp[c7]=3;
|
186
|
mTmp[c8]=4;
|
187
|
mTmp[c9]=5;
|
188
|
|
189
|
int perm_num = TablebaseHelpers.computeEvenPermutationNum(mTmp);
|
190
|
|
191
|
return perm_num + 360*(twist0+ 3*(twist1+ 3*(twist2+ 3*twist3)));
|
192
|
}
|
193
|
}
|
194
|
|