Project

General

Profile

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

distorted-objectlib / src / main / java / org / distorted / objectlib / bandaged / FactoryBandagedPyraminx.java @ f351be7d

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.bandaged;
11

    
12
import static org.distorted.objectlib.main.TwistyObject.SQ2;
13
import static org.distorted.objectlib.main.TwistyObject.SQ3;
14
import static org.distorted.objectlib.main.TwistyObject.SQ6;
15

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

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

    
20
public class FactoryBandagedPyraminx extends FactoryBandaged
21
  {
22
  private static final float[][] TET_VER =
23
          {
24
                  {    0,-SQ2/4,-0.5f },
25
                  {    0,-SQ2/4, 0.5f },
26
                  { 0.5f, SQ2/4,    0 },
27
                  {-0.5f, SQ2/4,    0 }
28
          };
29
  private static final float[][] OCT_VER =
30
          {
31
                  {    0, SQ2/2,    0 },
32
                  {    0,-SQ2/2,    0 },
33
                  { 0.5f,     0, 0.5f },
34
                  { 0.5f,     0,-0.5f },
35
                  {-0.5f,     0,-0.5f },
36
                  {-0.5f,     0, 0.5f },
37
          };
38

    
39
  private static FactoryBandagedPyraminx mThis;
40

    
41
///////////////////////////////////////////////////////////////////////////////////////////////////
42

    
43
  private FactoryBandagedPyraminx()
44
    {
45

    
46
    }
47

    
48
///////////////////////////////////////////////////////////////////////////////////////////////////
49

    
50
  public static FactoryBandagedPyraminx getInstance()
51
    {
52
    if( mThis==null ) mThis = new FactoryBandagedPyraminx();
53
    return mThis;
54
    }
55

    
56
///////////////////////////////////////////////////////////////////////////////////////////////////
57

    
58
  private float[] tetVertices(int ax, boolean left, float[] pos)
59
    {
60
    if( !left )
61
      {
62
      int i1=-1,i2=-1,i3=-1;
63

    
64
      switch(ax)
65
        {
66
        case 0: i1=1; i2=2; i3=3; break;
67
        case 1: i1=0; i2=3; i3=2; break;
68
        case 2: i1=0; i2=1; i3=3; break;
69
        case 3: i1=0; i2=2; i3=1; break;
70
        }
71

    
72
      float[] T1 = TET_VER[i1];
73
      float[] T2 = TET_VER[i2];
74
      float[] T3 = TET_VER[i3];
75

    
76
      return new float[] { pos[0]+T1[0], pos[1]+T1[1], pos[2]+T1[2],
77
                           pos[0]+T2[0], pos[1]+T2[1], pos[2]+T2[2],
78
                           pos[0]+T3[0], pos[1]+T3[1], pos[2]+T3[2] };
79
      }
80

    
81
    return null;
82
    }
83

    
84
///////////////////////////////////////////////////////////////////////////////////////////////////
85

    
86
  private float[] octVertices(int ax, boolean left, float[] pos)
87
    {
88
    int i1=-1,i2=-1,i3=-1;
89

    
90
    if( left )
91
      {
92
      switch(ax)
93
        {
94
        case 0: i1=1; i2=4; i3=3; break;
95
        case 1: i1=1; i2=2; i3=5; break;
96
        case 2: i1=0; i2=2; i3=3; break;
97
        case 3: i1=0; i2=4; i3=5; break;
98
        }
99
      }
100
    else
101
      {
102
      switch(ax)
103
        {
104
        case 0: i1=0; i2=5; i3=2; break;
105
        case 1: i1=0; i2=3; i3=4; break;
106
        case 2: i1=1; i2=5; i3=4; break;
107
        case 3: i1=1; i2=3; i3=2; break;
108
        }
109
      }
110

    
111
    float[] T1 = OCT_VER[i1];
112
    float[] T2 = OCT_VER[i2];
113
    float[] T3 = OCT_VER[i3];
114

    
115
    return new float[] { pos[0]+T1[0], pos[1]+T1[1], pos[2]+T1[2],
116
                         pos[0]+T2[0], pos[1]+T2[1], pos[2]+T2[2],
117
                         pos[0]+T3[0], pos[1]+T3[1], pos[2]+T3[2] };
118
    }
119

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

    
122
  public float[] elementVertices(int ax, boolean left, int element)
123
    {
124
    int variant = mElements[element].getVariant();
125
    float[] pos = mElements[element].getPos();
126

    
127
    if( variant==0 ) return octVertices(ax,left,pos);
128
    else             return tetVertices(ax,left,pos);
129
    }
130

    
131
///////////////////////////////////////////////////////////////////////////////////////////////////
132

    
133
  public boolean elementFaceNotNull(int ax, boolean left, int element)
134
    {
135
    int variant = mElements[element].getVariant();
136
    return ( variant==0 || !left );
137
    }
138

    
139
///////////////////////////////////////////////////////////////////////////////////////////////////
140
// see BandagedObjectPyraminx.addTetrahedralLattice()
141
// from there, 'y' is always of the form -DY*(size-1)/2 + K*DY, where DY = SQ2/2, K integer
142
// and 'size' is mNumLayers[0]-1 in case of Octahedrons and mNumLayers[0] in case of Tetrahedrons.
143
// From the above, the below quickly follows. +20*num1 to avoid negative values.
144

    
145
  public static int getElementVariant(int size, float y)
146
    {
147
    int num = (int)(2*SQ2*y + 20*size + 0.1f);
148
    return (num-size)%2;
149
    }
150

    
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152

    
153
  public int getElementVariant(float x, float y, float z)
154
    {
155
    return getElementVariant(mNumLayers[0],y);
156
    }
157

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

    
160
  public float[][] getCuts(int[] numLayers)
161
    {
162
    int numL = numLayers[0];
163
    float[][] ret = new float[4][numL-1];
164

    
165
    for(int i=0; i<numL-1; i++)
166
      {
167
      float cut = (1.0f+i-numL/4.0f)*(SQ6/3);
168
      ret[0][i] = cut;
169
      ret[1][i] = cut;
170
      ret[2][i] = cut;
171
      ret[3][i] = cut;
172
      }
173

    
174
    return ret;
175
    }
176

    
177
///////////////////////////////////////////////////////////////////////////////////////////////////
178

    
179
  public Static3D[] getNormals()
180
    {
181
    return new Static3D[]
182
            {
183
                    new Static3D(     0, SQ3/3, SQ6/3),
184
                    new Static3D(     0, SQ3/3,-SQ6/3),
185
                    new Static3D(-SQ6/3,-SQ3/3,     0),
186
                    new Static3D( SQ6/3,-SQ3/3,     0),
187
            };
188
    }
189

    
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191

    
192
  public float[][] getRotAxis()
193
    {
194
    return new float[][]
195
            {
196
                    {     0,-SQ3/3,-SQ6/3 },
197
                    {     0,-SQ3/3, SQ6/3 },
198
                    { SQ6/3, SQ3/3,     0 },
199
                    {-SQ6/3, SQ3/3,     0 },
200
            };
201
    }
202

    
203
///////////////////////////////////////////////////////////////////////////////////////////////////
204
// normalized 'edges' of the tetrahedron.
205

    
206
  public float[][] getDiameterAxis()
207
    {
208
    return new float[][]
209
            {
210
                    {    1,    0,    0},
211
                    {    0,    0,    1},
212
                    { 0.5f,SQ2/2, 0.5f},
213
                    { 0.5f,SQ2/2,-0.5f},
214
                    {-0.5f,SQ2/2, 0.5f},
215
                    {-0.5f,SQ2/2,-0.5f},
216
            };
217
    }
218

    
219
///////////////////////////////////////////////////////////////////////////////////////////////////
220

    
221
  public float[] getDist3D()
222
    {
223
    final float d = (SQ6/12)*mNumLayers[0];
224
    return new float[] {d,d,d,d};
225
    }
226

    
227
///////////////////////////////////////////////////////////////////////////////////////////////////
228

    
229
  public float[][] getBands(boolean iconMode)
230
    {
231
    float height= iconMode ? 0.001f : 0.055f;
232
    int[] angle = {68,54,43,35,30,26};
233
    float R     = 0.3f;
234
    float S     = 0.5f;
235
    int extraI  = 0;
236
    int extraV  = 0;
237

    
238
    int numVertA= mNumLayers[0]>=5 ? 3 : (mNumLayers[0]==4 ? 4:5);
239
    int numVertI= mNumLayers[0]>=5 ? 2 : 3;
240

    
241
    return new float[][] { {  0.001f,angle[0],R,S,numVertI,extraV,extraI},
242
                           {height  ,angle[1],R,S,numVertA,extraV,extraI},
243
                           {height/2,angle[2],R,S,numVertA,extraV,extraI},
244
                           {height/3,angle[3],R,S,numVertA,extraV,extraI},
245
                           {height/4,angle[4],R,S,numVertA,extraV,extraI},
246
                           {height/5,angle[5],R,S,numVertA,extraV,extraI} };
247
    }
248
  }
(8-8/8)