Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TBDino6.java @ 9e7ff8d2

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 static org.distorted.objectlib.main.TwistyObject.SQ3;
13

    
14
import android.content.res.Resources;
15

    
16
import org.distorted.library.type.Static3D;
17

    
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19

    
20
public class TBDino6 extends TablebasesAbstract
21
{
22
  private static final int[][] QUATS =
23
      {
24
          {0,2,10,8, 1,4,6,7,   11,5,9,3},
25
          {1,0,6,10, 2,5,8,3,   7,9,4,11},
26
          {10,5,0,3, 7,6,4,1,   9,2,11,8},
27
          {7,10,4,0, 5,2,3,8,   1,11,6,9},
28
          {2,1,8,6,  0,9,10,11, 3,4,5,7 },
29
          {3,6,5,1,  9,0,11,10, 2,7,8,4 },
30
          {5,7,3,4,  10,11,0,9, 8,6,2,1 },
31
          {8,4,2,7,  11,10,9,0, 5,1,3,6 },
32
          {11,8,9,2, 4,1,7,6,   0,3,10,5},
33
          {6,9,1,11, 3,8,5,2,   4,0,7,10},
34
          {9,3,11,5, 6,7,1,4,   10,8,0,2},
35
          {4,11,7,9, 8,3,2,5,   6,10,1,0}
36
      };
37

    
38
///////////////////////////////////////////////////////////////////////////////////////////////////
39

    
40
  public TBDino6()
41
    {
42
    super();
43
    }
44

    
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46

    
47
  public TBDino6(Resources res)
48
    {
49
    super(res,org.distorted.objectlib.R.raw.dino_3_tablebase);
50
    }
51

    
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53

    
54
  int[][] getBasicAngles()
55
    {
56
    int[] tmp = {3,3,3};
57
    return new int[][] { tmp,tmp,tmp,tmp };
58
    }
59

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

    
62
  Static3D[] getRotationAxis()
63
    {
64
    return new Static3D[]
65
         {
66
           new Static3D( SQ3/3, SQ3/3, SQ3/3),
67
           new Static3D( SQ3/3, SQ3/3,-SQ3/3),
68
           new Static3D( SQ3/3,-SQ3/3, SQ3/3),
69
           new Static3D( SQ3/3,-SQ3/3,-SQ3/3)
70
         };
71
    }
72

    
73
///////////////////////////////////////////////////////////////////////////////////////////////////
74

    
75
  float[][] getPosition()
76
    {
77
    return new float[][]
78
         {
79
             { 0.0f, 1.5f, 1.5f },
80
             { 1.5f, 0.0f, 1.5f },
81
             { 0.0f,-1.5f, 1.5f },
82
             {-1.5f, 0.0f, 1.5f },
83
             { 1.5f, 1.5f, 0.0f },
84
             { 1.5f,-1.5f, 0.0f },
85
             {-1.5f,-1.5f, 0.0f },
86
             {-1.5f, 1.5f, 0.0f },
87
             { 0.0f, 1.5f,-1.5f },
88
             { 1.5f, 0.0f,-1.5f },
89
             { 0.0f,-1.5f,-1.5f },
90
             {-1.5f, 0.0f,-1.5f }
91
         };
92
    }
93

    
94
///////////////////////////////////////////////////////////////////////////////////////////////////
95

    
96
  float[][] getCuts()
97
    {
98
    float[] cut = new float[] { -SQ3/3, SQ3/3 };
99
    return new float[][] { cut,cut,cut,cut };
100
    }
101

    
102
///////////////////////////////////////////////////////////////////////////////////////////////////
103
// exclude the middle layer and movements of edge[0].
104

    
105
  boolean[][] getRotatable()
106
    {
107
    boolean[] tmp = {true,false,true};
108
    return new boolean[][] { tmp,tmp,tmp,tmp };
109
    }
110

    
111
///////////////////////////////////////////////////////////////////////////////////////////////////
112
// specifically for the tablebase
113
///////////////////////////////////////////////////////////////////////////////////////////////////
114

    
115
  int getSize()
116
    {
117
    return 19958400;  // see https://www.jaapsch.net/puzzles/dinocube.htm
118
    }
119

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

    
122
  int getMinScramble()
123
    {
124
    return 9;
125
    }
126

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

    
129
  public static int getIndexFromPerm(int[] perm)
130
    {
131
    int[] perm11 = new int[11];
132
    for(int i=0; i<11; i++) perm11[i] = perm[i+1]-1;
133
    return TablebaseHelpers.computeEvenPermutationNum(perm11);
134
    }
135

    
136
///////////////////////////////////////////////////////////////////////////////////////////////////
137
// in-place!
138

    
139
  private int[] getPermFromQuats(int[] quats)
140
    {
141
    for(int i=0; i<12; i++)
142
      {
143
      int[] Q = QUATS[i];
144
      int quat = quats[i];
145

    
146
      for(int j=0; j<12; j++)
147
        if( Q[j]==quat )
148
          {
149
          quats[i] = j;
150
          break;
151
          }
152
      }
153

    
154
    return quats;
155
    }
156

    
157
///////////////////////////////////////////////////////////////////////////////////////////////////
158
// in-place!
159

    
160
  private int[] getQuatsFromPerm(int[] perm)
161
    {
162
    for(int i=0; i<12; i++)
163
      {
164
      int p = perm[i];
165
      perm[i] = QUATS[i][p];
166
      }
167

    
168
    return perm;
169
    }
170

    
171
///////////////////////////////////////////////////////////////////////////////////////////////////
172
// we rotate the whole thing so that quat[0] is always 0.
173

    
174
  private void normalizeQuats(int[] quats)
175
    {
176
    if( quats[0]!=0 )
177
      {
178
      int inverted = getInvertedQuat(quats[0]);
179
      quats[0] = 0;
180

    
181
      for(int i=1; i<12; i++)
182
        {
183
        int index = quats[i];
184
        quats[i] = getMultQuat(inverted,index);
185
        }
186
      }
187
    }
188

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

    
191
  int[] getQuats(int index)
192
    {
193
    int[] perm11 = new int[11];
194
    TablebaseHelpers.getEvenPermutationFromNum(perm11,index);
195
    int[] perm = new int[12];
196
    for(int i=1; i<12; i++) perm[i] = perm11[i-1]+1;
197
    return getQuatsFromPerm(perm);
198
    }
199

    
200
///////////////////////////////////////////////////////////////////////////////////////////////////
201

    
202
  int getIndex(int[] quats)
203
    {
204
//int[] q1 = new int[12];
205
//for(int i=0; i<12; i++) q1[i] = quats[i];
206

    
207
    normalizeQuats(quats);
208

    
209
//int[] q2 = new int[12];
210
//for(int i=0; i<12; i++) q2[i] = quats[i];
211

    
212

    
213
    int[] perm = getPermFromQuats(quats);
214
    int ret = getIndexFromPerm(perm);
215
/*
216
    if( ret<0 )
217
      {
218
      StringBuilder sb = new StringBuilder();
219

    
220
      for(int i=0; i<12; i++)
221
        {
222
        sb.append(' ');
223
        sb.append(q1[i]);
224
        }
225
      android.util.Log.e("D", "getIndex: returning="+ret+" orig quats: "+sb);
226

    
227
      StringBuilder sb1 = new StringBuilder();
228

    
229
      for(int i=0; i<12; i++)
230
        {
231
        sb1.append(' ');
232
        sb1.append(q2[i]);
233
        }
234
      android.util.Log.e("D", "getIndex: returning="+ret+" norm quats: "+sb1);
235

    
236

    
237
      StringBuilder sb2 = new StringBuilder();
238

    
239
      for(int i=0; i<12; i++)
240
        {
241
        sb2.append(' ');
242
        sb2.append(perm[i]);
243
        }
244
      android.util.Log.e("D", "getIndex: returning="+ret+" perm: "+sb2);
245
      }
246
*/
247
    return ret;
248
    }
249
}  
250

    
(5-5/15)