Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / tablebases / TablebasesPyraminxDuo.java @ b4111717

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.SQ2;
13

    
14
import org.distorted.library.type.Static3D;
15
import org.distorted.objectlib.objects.TwistyPyraminxDuo;
16

    
17
///////////////////////////////////////////////////////////////////////////////////////////////////
18

    
19
public class TablebasesPyraminxDuo extends TablebasesCreator
20
{
21
  int[][] getBasicAngles()
22
    {
23
    int[] tmp = {3,3};
24
    return new int[][] { tmp,tmp,tmp,tmp };
25
    }
26

    
27
///////////////////////////////////////////////////////////////////////////////////////////////////
28

    
29
  Static3D[] getRotationAxis()
30
    {
31
    return TwistyPyraminxDuo.ROT_AXIS;
32
    }
33

    
34
///////////////////////////////////////////////////////////////////////////////////////////////////
35

    
36
  float[][] getPosition()
37
    {
38
    return new float[][]
39
         {
40
           { 0.000f, -SQ2/2, 1.000f },
41
           { 0.000f, -SQ2/2,-1.000f },
42
           {-1.000f,  SQ2/2, 0.000f },
43
           { 1.000f,  SQ2/2, 0.000f },
44

    
45
           { 0.000f,  SQ2/6, 1.0f/3 },
46
           { 0.000f,  SQ2/6,-1.0f/3 },
47
           {-1.0f/3, -SQ2/6, 0.000f },
48
           { 1.0f/3, -SQ2/6, 0.000f },
49
         };
50
    }
51

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

    
54
  float[][] getCuts()
55
    {
56
    float[] cut = { 0.0f };
57
    return new float[][] { cut,cut,cut,cut };
58
    }
59

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

    
62
  boolean[][] getRotatable()
63
    {
64
    boolean[] tmp = new boolean[] {false,true};
65
    return new boolean[][] { tmp,tmp,tmp,tmp };
66
    }
67

    
68
///////////////////////////////////////////////////////////////////////////////////////////////////
69
// specifically for the tablebase
70
///////////////////////////////////////////////////////////////////////////////////////////////////
71

    
72
  int getSize()
73
    {
74
    return 324;  // see https://www.jaapsch.net/puzzles/pyraduo.htm
75
    }
76

    
77
///////////////////////////////////////////////////////////////////////////////////////////////////
78

    
79
  int[] getQuats(int index)
80
    {
81
    int c = index%4; index/=4;
82
    int b3= index%3; index/=3;
83
    int b2= index%3; index/=3;
84
    int b1= index%3; index/=3;
85
    int b0= index%3;
86

    
87
    // we don't need to care about the values of the last 3 quats, but do include them.
88
    int[] quats = new int[8];
89

    
90
    switch(c)
91
      {
92
      case 0: quats[4] = 2; break;
93
      case 1: quats[4] = 5; break;
94
      case 2: quats[4] = 4; break;
95
      case 3: quats[4] = 3; break;
96
      }
97

    
98
    switch(b3)
99
      {
100
      case 0: quats[3] = 0; break;
101
      case 1: quats[3] = 5; break;
102
      case 2: quats[3] = 6; break;
103
      }
104

    
105
    switch(b2)
106
      {
107
      case 0: quats[2] = 0; break;
108
      case 1: quats[2] = 7; break;
109
      case 2: quats[2] = 8; break;
110
      }
111

    
112
    switch(b1)
113
      {
114
      case 0: quats[1] = 0; break;
115
      case 1: quats[1] = 1; break;
116
      case 2: quats[1] = 2; break;
117
      }
118

    
119
    switch(b0)
120
      {
121
      case 0: quats[0] = 0; break;
122
      case 1: quats[0] = 3; break;
123
      case 2: quats[0] = 4; break;
124
      }
125

    
126
    return quats;
127
    }
128

    
129
///////////////////////////////////////////////////////////////////////////////////////////////////
130

    
131
  private int computeCornerTwistFromQuat(int quat)
132
    {
133
    switch(quat)
134
      {
135
      case 0: case 9: case 10: case 11: return 0;
136
      case 1: case 3: case  5: case  7: return 1;
137
      case 2: case 4: case  6: case  8: return 2;
138
      }
139

    
140
    return -1;
141
    }
142

    
143
///////////////////////////////////////////////////////////////////////////////////////////////////
144

    
145
  int getIndex(int[] quats)
146
    {
147
    int b0 = computeCornerTwistFromQuat(quats[0]);
148
    int b1 = computeCornerTwistFromQuat(quats[1]);
149
    int b2 = computeCornerTwistFromQuat(quats[2]);
150
    int b3 = computeCornerTwistFromQuat(quats[3]);
151

    
152
    int c = -1;
153
    switch(quats[4])
154
      {
155
      case  0: case  1: case  2: c=0; break;
156
      case  5: case  8: case 10: c=1; break;
157
      case  4: case  7: case 11: c=2; break;
158
      case  3: case  6: case  9: c=3; break;
159
      }
160

    
161
    return c + 4*(b3 + 3*(b2 + 3*(b1 + 3*b0)));
162
    }
163
}  
164

    
(3-3/3)