Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TBPyraminxDuo.java @ efc71331

1 a110ebe1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
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.SQ2;
13 ccd8a6f2 Leszek Koltunski
import static org.distorted.objectlib.main.TwistyObject.SQ3;
14
import static org.distorted.objectlib.main.TwistyObject.SQ6;
15 a110ebe1 Leszek Koltunski
16
import org.distorted.library.type.Static3D;
17 3103c3c8 Leszek Koltunski
import org.distorted.objectlib.helpers.OperatingSystemInterface;
18 a110ebe1 Leszek Koltunski
19
///////////////////////////////////////////////////////////////////////////////////////////////////
20
21 a8d83300 Leszek Koltunski
public class TBPyraminxDuo extends TablebasesAbstract
22 a110ebe1 Leszek Koltunski
{
23 352b3356 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
24
25 a8d83300 Leszek Koltunski
  public TBPyraminxDuo()
26 352b3356 Leszek Koltunski
    {
27
    super();
28
    }
29
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31
32 3103c3c8 Leszek Koltunski
  public TBPyraminxDuo(OperatingSystemInterface os)
33 352b3356 Leszek Koltunski
    {
34 3103c3c8 Leszek Koltunski
    super(os,org.distorted.objectlib.R.raw.pduo_2_tablebase);
35 352b3356 Leszek Koltunski
    }
36
37
///////////////////////////////////////////////////////////////////////////////////////////////////
38
39 a110ebe1 Leszek Koltunski
  int[][] getBasicAngles()
40
    {
41
    int[] tmp = {3,3};
42
    return new int[][] { tmp,tmp,tmp,tmp };
43
    }
44
45
///////////////////////////////////////////////////////////////////////////////////////////////////
46
47
  Static3D[] getRotationAxis()
48
    {
49 ccd8a6f2 Leszek Koltunski
    return new Static3D[]
50
         {
51
           new Static3D(     0,-SQ3/3,-SQ6/3),
52
           new Static3D(     0,-SQ3/3, SQ6/3),
53
           new Static3D( SQ6/3, SQ3/3,     0),
54
           new Static3D(-SQ6/3, SQ3/3,     0),
55
         };
56 a110ebe1 Leszek Koltunski
    }
57
58
///////////////////////////////////////////////////////////////////////////////////////////////////
59
60
  float[][] getPosition()
61
    {
62
    return new float[][]
63
         {
64
           { 0.000f, -SQ2/2, 1.000f },
65
           { 0.000f, -SQ2/2,-1.000f },
66
           {-1.000f,  SQ2/2, 0.000f },
67
           { 1.000f,  SQ2/2, 0.000f },
68
69
           { 0.000f,  SQ2/6, 1.0f/3 },
70
           { 0.000f,  SQ2/6,-1.0f/3 },
71
           {-1.0f/3, -SQ2/6, 0.000f },
72
           { 1.0f/3, -SQ2/6, 0.000f },
73
         };
74
    }
75
76
///////////////////////////////////////////////////////////////////////////////////////////////////
77
78
  float[][] getCuts()
79
    {
80
    float[] cut = { 0.0f };
81
    return new float[][] { cut,cut,cut,cut };
82
    }
83
84 b4111717 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
85
86
  boolean[][] getRotatable()
87
    {
88
    boolean[] tmp = new boolean[] {false,true};
89
    return new boolean[][] { tmp,tmp,tmp,tmp };
90
    }
91
92 a110ebe1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
93
// specifically for the tablebase
94
///////////////////////////////////////////////////////////////////////////////////////////////////
95
96
  int getSize()
97
    {
98
    return 324;  // see https://www.jaapsch.net/puzzles/pyraduo.htm
99
    }
100
101 c0266cb1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
102
103 884b702b Leszek Koltunski
  int getMinScramble()
104 c0266cb1 Leszek Koltunski
    {
105
    return 4;
106
    }
107
108 a110ebe1 Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
109
110
  int[] getQuats(int index)
111
    {
112
    int c = index%4; index/=4;
113
    int b3= index%3; index/=3;
114
    int b2= index%3; index/=3;
115
    int b1= index%3; index/=3;
116
    int b0= index%3;
117
118
    // we don't need to care about the values of the last 3 quats, but do include them.
119
    int[] quats = new int[8];
120
121
    switch(c)
122
      {
123
      case 0: quats[4] = 2; break;
124 b4111717 Leszek Koltunski
      case 1: quats[4] = 5; break;
125 a110ebe1 Leszek Koltunski
      case 2: quats[4] = 4; break;
126 b4111717 Leszek Koltunski
      case 3: quats[4] = 3; break;
127 a110ebe1 Leszek Koltunski
      }
128
129
    switch(b3)
130
      {
131
      case 0: quats[3] = 0; break;
132
      case 1: quats[3] = 5; break;
133
      case 2: quats[3] = 6; break;
134
      }
135
136
    switch(b2)
137
      {
138
      case 0: quats[2] = 0; break;
139
      case 1: quats[2] = 7; break;
140
      case 2: quats[2] = 8; break;
141
      }
142
143
    switch(b1)
144
      {
145
      case 0: quats[1] = 0; break;
146
      case 1: quats[1] = 1; break;
147
      case 2: quats[1] = 2; break;
148
      }
149
150
    switch(b0)
151
      {
152
      case 0: quats[0] = 0; break;
153
      case 1: quats[0] = 3; break;
154
      case 2: quats[0] = 4; break;
155
      }
156
157
    return quats;
158
    }
159
160
///////////////////////////////////////////////////////////////////////////////////////////////////
161
162
  private int computeCornerTwistFromQuat(int quat)
163
    {
164
    switch(quat)
165
      {
166
      case 0: case 9: case 10: case 11: return 0;
167
      case 1: case 3: case  5: case  7: return 1;
168
      case 2: case 4: case  6: case  8: return 2;
169
      }
170
171
    return -1;
172
    }
173
174
///////////////////////////////////////////////////////////////////////////////////////////////////
175
176
  int getIndex(int[] quats)
177
    {
178
    int b0 = computeCornerTwistFromQuat(quats[0]);
179
    int b1 = computeCornerTwistFromQuat(quats[1]);
180
    int b2 = computeCornerTwistFromQuat(quats[2]);
181
    int b3 = computeCornerTwistFromQuat(quats[3]);
182
183
    int c = -1;
184
    switch(quats[4])
185
      {
186
      case  0: case  1: case  2: c=0; break;
187 b4111717 Leszek Koltunski
      case  5: case  8: case 10: c=1; break;
188 a110ebe1 Leszek Koltunski
      case  4: case  7: case 11: c=2; break;
189 b4111717 Leszek Koltunski
      case  3: case  6: case  9: c=3; break;
190 a110ebe1 Leszek Koltunski
      }
191
192 b4111717 Leszek Koltunski
    return c + 4*(b3 + 3*(b2 + 3*(b1 + 3*b0)));
193 a110ebe1 Leszek Koltunski
    }
194
}