Project

General

Profile

Download (7.94 KB) Statistics
| Branch: | Revision:

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TablebasesCuboid232.java @ 884b702b

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

    
16
///////////////////////////////////////////////////////////////////////////////////////////////////
17

    
18
public class TablebasesCuboid232 extends TablebasesAbstract
19
{
20
  private static final int[][] CORNER_MAP = new int[][]
21
      {
22
          {0,4,7,1,2,3,5,6},
23
          {2,0,1,6,3,4,7,5},
24
          {7,1,0,4,5,6,2,3},
25
          {1,6,2,0,7,5,3,4},
26
          {4,3,5,7,0,2,6,1},
27
          {3,2,6,5,4,0,1,7},
28
          {5,7,4,3,6,1,0,2},
29
          {6,5,3,2,1,7,4,0}
30
      };
31

    
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33

    
34
  public TablebasesCuboid232()
35
    {
36
    super();
37
    }
38

    
39
///////////////////////////////////////////////////////////////////////////////////////////////////
40

    
41
  public TablebasesCuboid232(Resources res)
42
    {
43
    super(res,org.distorted.objectlib.R.raw.cu_232_tablebase);
44
    }
45

    
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47

    
48
  int[][] getBasicAngles()
49
    {
50
    int[] tmp2 = {2,2};
51
    int[] tmp4 = {4,4,4};
52
    return new int[][] { tmp2,tmp4,tmp2 };
53
    }
54

    
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56

    
57
  Static3D[] getRotationAxis()
58
    {
59
    return new Static3D[]
60
         {
61
           new Static3D(1,0,0),
62
           new Static3D(0,1,0),
63
           new Static3D(0,0,1)
64
         };
65
    }
66

    
67
///////////////////////////////////////////////////////////////////////////////////////////////////
68

    
69
  float[][] getPosition()
70
    {
71
    return new float[][]
72
      {
73
        { -0.5f, -1.0f, -0.5f },
74
        { -0.5f, -1.0f,  0.5f },
75
        { -0.5f,  1.0f, -0.5f },
76
        { -0.5f,  1.0f,  0.5f },
77
        {  0.5f, -1.0f, -0.5f },
78
        {  0.5f, -1.0f,  0.5f },
79
        {  0.5f,  1.0f, -0.5f },
80
        {  0.5f,  1.0f,  0.5f },
81

    
82
        { -0.5f,  0.0f, -0.5f },
83
        { -0.5f,  0.0f,  0.5f },
84
        {  0.5f,  0.0f, -0.5f },
85
        {  0.5f,  0.0f,  0.5f },
86
      };
87
    }
88

    
89
///////////////////////////////////////////////////////////////////////////////////////////////////
90

    
91
  float[][] getCuts()
92
    {
93
    return new float[][] { {0.0f}, {-0.5f,0.5f}, {0.0f} };
94
    }
95

    
96
///////////////////////////////////////////////////////////////////////////////////////////////////
97

    
98
  boolean[][] getRotatable()
99
    {
100
    return new boolean[][] { {false,true},{true,false,true},{true,false} };
101
    }
102

    
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104
// specifically for the tablebase
105
///////////////////////////////////////////////////////////////////////////////////////////////////
106
// 8!*3! --> https://www.jaapsch.net/puzzles/cube223.htm
107

    
108
  int getSize()
109
    {
110
    return 241920;
111
    }
112

    
113
///////////////////////////////////////////////////////////////////////////////////////////////////
114

    
115
  int getMinScramble()
116
    {
117
    return 12;
118
    }
119

    
120
///////////////////////////////////////////////////////////////////////////////////////////////////
121

    
122
  int[] getPruningLevels()
123
    {
124
    return null;
125
    }
126

    
127
///////////////////////////////////////////////////////////////////////////////////////////////////
128

    
129
  private void getCornerQuats(int[] output, int[] perm)
130
    {
131
    for(int i=0; i<8; i++)
132
      output[i] = CORNER_MAP[i][perm[i]];
133
    }
134

    
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136

    
137
  private int[] getCornerPerm(int[] quats)
138
    {
139
    int[] output = new int[8];
140

    
141
    for(int i=0; i<8; i++)
142
      {
143
      int quat = quats[i];
144

    
145
      for(int j=0; j<8; j++)
146
        {
147
        if( CORNER_MAP[i][j]==quat )
148
          {
149
          output[i]=j;
150
          break;
151
          }
152
        }
153
      }
154

    
155
    return output;
156
    }
157

    
158
///////////////////////////////////////////////////////////////////////////////////////////////////
159

    
160
  private void getEdgeQuats(int[] output, int[] perm)
161
    {
162
    switch(perm[0])
163
      {
164
      case 0: output[8] = 0; break;
165
      case 2: output[8] = 5; break;
166
      case 3: output[8] = 3; break;
167
      default: android.util.Log.e("D", "getEdgeQuats ERROR1");
168
      }
169

    
170
    output[9] = 0;
171

    
172
    switch(perm[2])
173
      {
174
      case 0: output[10] = 5; break;
175
      case 2: output[10] = 0; break;
176
      case 3: output[10] = 1; break;
177
      default: android.util.Log.e("D", "getEdgeQuats ERROR2");
178
      }
179

    
180
    switch(perm[3])
181
      {
182
      case 0: output[11] = 3; break;
183
      case 2: output[11] = 1; break;
184
      case 3: output[11] = 0; break;
185
      default: android.util.Log.e("D", "getEdgeQuats ERROR3");
186
      }
187
    }
188

    
189
///////////////////////////////////////////////////////////////////////////////////////////////////
190

    
191
  private int[] getEdgePerm(int[] quats)
192
    {
193
    int[] output = new int[4];
194

    
195
    switch(quats[8])
196
      {
197
      case 0: output[0] = 0; break;
198
      case 5: output[0] = 2; break;
199
      case 3: output[0] = 3; break;
200
      default: android.util.Log.e("D", "getEdgePerm ERROR1");
201
      }
202

    
203
    output[1] = 1;
204

    
205
    switch(quats[10])
206
      {
207
      case 0: output[2] = 2; break;
208
      case 1: output[2] = 3; break;
209
      case 5: output[2] = 0; break;
210
      default: android.util.Log.e("D", "getEdgePerm ERROR2");
211
      }
212

    
213
    switch(quats[11])
214
      {
215
      case 0: output[3] = 3; break;
216
      case 1: output[3] = 2; break;
217
      case 3: output[3] = 0; break;
218
      default: android.util.Log.e("D", "getEdgePerm ERROR3");
219
      }
220

    
221
    return output;
222
    }
223

    
224
///////////////////////////////////////////////////////////////////////////////////////////////////
225

    
226
  private int[] uncollapseEdgePerm(int[] perm)
227
    {
228
    int[] ret = new int[4];
229

    
230
    ret[0] = perm[0];
231
    ret[1] = 1;
232
    ret[2] = perm[1];
233
    ret[3] = perm[2];
234

    
235
    if( ret[0]>=1 ) ret[0]++;
236
    if( ret[2]>=1 ) ret[2]++;
237
    if( ret[3]>=1 ) ret[3]++;
238

    
239
    return ret;
240
    }
241

    
242
///////////////////////////////////////////////////////////////////////////////////////////////////
243

    
244
  public int[] getQuats(int index)
245
    {
246
    int[] quats = new int[12];
247

    
248
    int edge_perm_num = index%6;
249
    int corn_perm_num = index/6;
250

    
251
    int[] edge_perm = new int[3];
252
    TablebaseHelpers.getPermutationFromNum(edge_perm,3,edge_perm_num);
253

    
254
    int[] corn_perm = new int[8];
255
    TablebaseHelpers.getPermutationFromNum(corn_perm,8,corn_perm_num);
256

    
257
    int[] edge_perm2 = uncollapseEdgePerm(edge_perm);
258
    getCornerQuats(quats,corn_perm);
259
    getEdgeQuats(quats,edge_perm2);
260

    
261
    return quats;
262
    }
263

    
264
///////////////////////////////////////////////////////////////////////////////////////////////////
265

    
266
  private int[] collapseEdgePerm(int[] perm)
267
    {
268
    int[] ret = new int[3];
269

    
270
    ret[0] = perm[0];
271
    ret[1] = perm[2];
272
    ret[2] = perm[3];
273

    
274
    if( ret[0]>1 ) ret[0]--;
275
    if( ret[1]>1 ) ret[1]--;
276
    if( ret[2]>1 ) ret[2]--;
277

    
278
    return ret;
279
    }
280

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

    
283
  public int getIndex(int[] quats)
284
    {
285
    int[] edge_perm = getEdgePerm(quats);
286
    int[] corn_perm = getCornerPerm(quats);
287
    int[] edge_perm2= collapseEdgePerm(edge_perm); // edge1 is fixed!
288

    
289
    int corn_perm_num = TablebaseHelpers.computePermutationNum(corn_perm);
290
    int edge_perm_num = TablebaseHelpers.computePermutationNum(edge_perm2);
291

    
292
    return edge_perm_num + 6*corn_perm_num;
293
    }
294
}  
295

    
(7-7/12)