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.helpers;
|
11
|
|
12
|
import static org.distorted.objectlib.main.TwistyObject.SQ3;
|
13
|
import static org.distorted.objectlib.main.TwistyObject.SQ6;
|
14
|
|
15
|
import org.distorted.library.type.Static3D;
|
16
|
import org.distorted.objectlib.touchcontrol.TouchControlTetrahedron;
|
17
|
|
18
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
19
|
|
20
|
public class FactoryBandagedPyraminx extends FactoryBandaged
|
21
|
{
|
22
|
private static FactoryBandagedPyraminx mThis;
|
23
|
|
24
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
25
|
|
26
|
private FactoryBandagedPyraminx()
|
27
|
{
|
28
|
|
29
|
}
|
30
|
|
31
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
32
|
// TODO
|
33
|
|
34
|
public float[] elementVertices(int ax, boolean left, int element)
|
35
|
{
|
36
|
return null;
|
37
|
}
|
38
|
|
39
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
40
|
// (vertices,indices) define a cubit face. Return its 'diameter', i.e. max distance between vertices.
|
41
|
|
42
|
float faceDiameter(float[][] vertices, int[][] indices)
|
43
|
{
|
44
|
/*
|
45
|
float maxX = -dX;
|
46
|
float minX = dX;
|
47
|
float maxY = -dY;
|
48
|
float minY = dY;
|
49
|
float maxZ = -dZ;
|
50
|
float minZ = dZ;
|
51
|
|
52
|
for (int[] ind : indices)
|
53
|
for(int index : ind)
|
54
|
{
|
55
|
float[] v = vertices[index];
|
56
|
|
57
|
if (v[0] > maxX) maxX = v[0];
|
58
|
if (v[0] < minX) minX = v[0];
|
59
|
if (v[1] > maxY) maxY = v[1];
|
60
|
if (v[1] < minY) minY = v[1];
|
61
|
if (v[2] > maxZ) maxZ = v[2];
|
62
|
if (v[2] < minZ) minZ = v[2];
|
63
|
}
|
64
|
|
65
|
float diffX = maxX-minX;
|
66
|
float diffY = maxY-minY;
|
67
|
float diffZ = maxZ-minZ;
|
68
|
|
69
|
return diffX>diffY ? Math.max(diffX,diffZ) : Math.max(diffY,diffZ);
|
70
|
|
71
|
*/
|
72
|
return 0;
|
73
|
}
|
74
|
|
75
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
76
|
// PUBLIC API
|
77
|
|
78
|
public static FactoryBandagedPyraminx getInstance()
|
79
|
{
|
80
|
if( mThis==null ) mThis = new FactoryBandagedPyraminx();
|
81
|
return mThis;
|
82
|
}
|
83
|
|
84
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
85
|
|
86
|
public float[][] getCuts(int[] numLayers)
|
87
|
{
|
88
|
int numL = numLayers[0];
|
89
|
float[][] ret = new float[4][numL-1];
|
90
|
|
91
|
for(int i=0; i<numL-1; i++)
|
92
|
{
|
93
|
float cut = (1.0f+i-numL/4.0f)*(SQ6/3);
|
94
|
ret[0][i] = cut;
|
95
|
ret[1][i] = cut;
|
96
|
ret[2][i] = cut;
|
97
|
ret[3][i] = cut;
|
98
|
}
|
99
|
|
100
|
return ret;
|
101
|
}
|
102
|
|
103
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
104
|
|
105
|
public Static3D[] getNormals()
|
106
|
{
|
107
|
return TouchControlTetrahedron.FACE_AXIS;
|
108
|
}
|
109
|
|
110
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
111
|
|
112
|
public float[][] getRotAxis()
|
113
|
{
|
114
|
return new float[][]
|
115
|
{
|
116
|
{ 0, SQ3/3, SQ6/3 },
|
117
|
{ 0, SQ3/3,-SQ6/3 },
|
118
|
{-SQ6/3,-SQ3/3, 0 },
|
119
|
{ SQ6/3,-SQ3/3, 0 },
|
120
|
};
|
121
|
}
|
122
|
|
123
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
124
|
|
125
|
public float[] getDist3D()
|
126
|
{
|
127
|
return TouchControlTetrahedron.D3D;
|
128
|
}
|
129
|
|
130
|
///////////////////////////////////////////////////////////////////////////////////////////////////
|
131
|
|
132
|
public float[][] getBands(boolean iconMode)
|
133
|
{
|
134
|
float height= iconMode ? 0.001f : 0.048f;
|
135
|
int[] angle = {60,50,40,32,28,23};
|
136
|
float R = 0.2f;
|
137
|
float S = 0.5f;
|
138
|
int extraI = 0;
|
139
|
int extraV = 0;
|
140
|
|
141
|
int numVertA= mNumLayers[0]>=5 ? 3 : (mNumLayers[0]==4 ? 4:5);
|
142
|
int numVertI= mNumLayers[0]>=5 ? 2 : 3;
|
143
|
|
144
|
return new float[][] { { 0.001f,angle[0],R,S,numVertI,extraV,extraI},
|
145
|
{height ,angle[1],R,S,numVertA,extraV,extraI},
|
146
|
{height/2,angle[2],R,S,numVertA,extraV,extraI},
|
147
|
{height/3,angle[3],R,S,numVertA,extraV,extraI},
|
148
|
{height/4,angle[4],R,S,numVertA,extraV,extraI},
|
149
|
{height/5,angle[5],R,S,numVertA,extraV,extraI} };
|
150
|
}
|
151
|
}
|