Revision e6cf7283
Added by Leszek Koltunski almost 4 years ago
src/main/java/org/distorted/objects/Cubit.java | ||
---|---|---|
21 | 21 |
|
22 | 22 |
import android.content.SharedPreferences; |
23 | 23 |
|
24 |
import org.distorted.library.type.Static3D; |
|
25 | 24 |
import org.distorted.library.type.Static4D; |
26 | 25 |
import org.distorted.main.RubikSurfaceView; |
27 | 26 |
|
... | ... | |
29 | 28 |
|
30 | 29 |
class Cubit |
31 | 30 |
{ |
32 |
private final Static3D mOrigPosition;
|
|
33 |
private final Static3D mCurrentPosition;
|
|
31 |
private final float[] mOrigPosition;
|
|
32 |
private final float[] mCurrentPosition;
|
|
34 | 33 |
private TwistyObject mParent; |
35 | 34 |
private final int mNumAxis; |
35 |
private final int mLen; |
|
36 | 36 |
|
37 | 37 |
int mQuatIndex; |
38 | 38 |
int[] mRotationRow; |
39 | 39 |
|
40 | 40 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
41 | 41 |
|
42 |
Cubit(TwistyObject parent, Static3D position)
|
|
42 |
Cubit(TwistyObject parent, float[] position)
|
|
43 | 43 |
{ |
44 |
float x = position.get0();
|
|
45 |
float y = position.get1();
|
|
46 |
float z = position.get2();
|
|
44 |
mQuatIndex= 0;
|
|
45 |
mParent = parent;
|
|
46 |
mLen = position.length;
|
|
47 | 47 |
|
48 |
mParent = parent; |
|
49 |
mOrigPosition = new Static3D(x,y,z); |
|
50 |
mCurrentPosition = new Static3D(x,y,z); |
|
51 |
mQuatIndex = 0; |
|
48 |
mOrigPosition = new float[mLen]; |
|
49 |
mCurrentPosition = new float[mLen]; |
|
50 |
|
|
51 |
for(int i=0; i<mLen; i++) |
|
52 |
{ |
|
53 |
mOrigPosition[i] = position[i]; |
|
54 |
mCurrentPosition[i] = position[i]; |
|
55 |
} |
|
52 | 56 |
|
53 | 57 |
mNumAxis = mParent.ROTATION_AXIS.length; |
54 | 58 |
mRotationRow = new int[mNumAxis]; |
... | ... | |
113 | 117 |
|
114 | 118 |
private void computeRotationRow() |
115 | 119 |
{ |
116 |
float x = mCurrentPosition.get0(); |
|
117 |
float y = mCurrentPosition.get1(); |
|
118 |
float z = mCurrentPosition.get2(); |
|
119 |
|
|
120 | 120 |
for(int i=0; i<mNumAxis; i++) |
121 | 121 |
{ |
122 |
mRotationRow[i] = mParent.computeRow(x,y,z,i);
|
|
122 |
mRotationRow[i] = mParent.computeRow(mCurrentPosition,i);
|
|
123 | 123 |
} |
124 | 124 |
} |
125 | 125 |
|
126 | 126 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
127 | 127 |
|
128 |
Static3D getOrigPosition()
|
|
128 |
float[] getOrigPosition()
|
|
129 | 129 |
{ |
130 | 130 |
return mOrigPosition; |
131 | 131 |
} |
... | ... | |
134 | 134 |
|
135 | 135 |
void modifyCurrentPosition(Static4D quat) |
136 | 136 |
{ |
137 |
float cubitCenterX = mCurrentPosition.get0();
|
|
138 |
float cubitCenterY = mCurrentPosition.get1();
|
|
139 |
float cubitCenterZ = mCurrentPosition.get2();
|
|
137 |
Static4D cubitCenter;
|
|
138 |
Static4D rotatedCenter;
|
|
139 |
int len = mLen/3;
|
|
140 | 140 |
|
141 |
Static4D cubitCenter = new Static4D(cubitCenterX, cubitCenterY, cubitCenterZ, 0); |
|
142 |
Static4D rotatedCenter = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat); |
|
141 |
for(int i=0; i<len; i++) |
|
142 |
{ |
|
143 |
cubitCenter = new Static4D(mCurrentPosition[3*i], mCurrentPosition[3*i+1], mCurrentPosition[3*i+2], 0); |
|
144 |
rotatedCenter = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat); |
|
143 | 145 |
|
144 |
float rotatedX = rotatedCenter.get0();
|
|
145 |
float rotatedY = rotatedCenter.get1();
|
|
146 |
float rotatedZ = rotatedCenter.get2();
|
|
146 |
mCurrentPosition[3*i ] = rotatedCenter.get0();
|
|
147 |
mCurrentPosition[3*i+1] = rotatedCenter.get1();
|
|
148 |
mCurrentPosition[3*i+2] = rotatedCenter.get2();
|
|
147 | 149 |
|
148 |
mCurrentPosition.set(rotatedX, rotatedY, rotatedZ);
|
|
149 |
mParent.clampPos(mCurrentPosition);
|
|
150 |
mParent.clampPos(mCurrentPosition, 3*i);
|
|
151 |
}
|
|
150 | 152 |
|
151 | 153 |
computeRotationRow(); |
152 | 154 |
} |
... | ... | |
170 | 172 |
|
171 | 173 |
void savePreferences(SharedPreferences.Editor editor) |
172 | 174 |
{ |
173 |
String number = mOrigPosition.get0()+"_"+mOrigPosition.get1()+"_"+mOrigPosition.get2();
|
|
175 |
String number = mOrigPosition[0]+"_"+mOrigPosition[1]+"_"+mOrigPosition[2];
|
|
174 | 176 |
editor.putInt("q_"+number, mQuatIndex); |
175 | 177 |
} |
176 | 178 |
|
... | ... | |
178 | 180 |
|
179 | 181 |
int restorePreferences(SharedPreferences preferences) |
180 | 182 |
{ |
181 |
String number = mOrigPosition.get0()+"_"+mOrigPosition.get1()+"_"+mOrigPosition.get2();
|
|
183 |
String number = mOrigPosition[0]+"_"+mOrigPosition[1]+"_"+mOrigPosition[2];
|
|
182 | 184 |
mQuatIndex = preferences.getInt("q_"+number, 0); |
183 | 185 |
return mQuatIndex; |
184 | 186 |
} |
... | ... | |
200 | 202 |
void solve() |
201 | 203 |
{ |
202 | 204 |
mQuatIndex = 0; |
203 |
mCurrentPosition.set(mOrigPosition);
|
|
205 |
System.arraycopy(mOrigPosition, 0, mCurrentPosition, 0, mCurrentPosition.length);
|
|
204 | 206 |
computeRotationRow(); |
205 | 207 |
} |
206 | 208 |
|
... | ... | |
212 | 214 |
} |
213 | 215 |
|
214 | 216 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
217 |
// this is only needed for MODE_REPLACE objects (i.e. - currently - CUBE_3), so it is enough to only |
|
218 |
// take into consideration the first position. |
|
215 | 219 |
|
216 | 220 |
float getDistSquared(float[] point) |
217 | 221 |
{ |
218 |
float dx = mCurrentPosition.get0() - point[0];
|
|
219 |
float dy = mCurrentPosition.get1() - point[1];
|
|
220 |
float dz = mCurrentPosition.get2() - point[2];
|
|
222 |
float dx = mCurrentPosition[0] - point[0];
|
|
223 |
float dy = mCurrentPosition[1] - point[1];
|
|
224 |
float dz = mCurrentPosition[2] - point[2];
|
|
221 | 225 |
|
222 | 226 |
return dx*dx + dy*dy + dz*dz; |
223 | 227 |
} |
src/main/java/org/distorted/objects/TwistyBandagedAbstract.java | ||
---|---|---|
193 | 193 |
|
194 | 194 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
195 | 195 |
|
196 |
Static3D[] getCubitPositions(int size)
|
|
196 |
float[][] getCubitPositions(int size)
|
|
197 | 197 |
{ |
198 | 198 |
int numCubits = getNumCubits(); |
199 |
Static3D[] tmp = new Static3D[numCubits];
|
|
199 |
float[][] tmp = new float[numCubits][];
|
|
200 | 200 |
|
201 | 201 |
for(int cubit=0; cubit<numCubits; cubit++) |
202 | 202 |
{ |
203 |
float[] pos = getCubitPosition(cubit); |
|
204 |
tmp[cubit] = new Static3D(pos[0],pos[1],pos[2]); |
|
203 |
tmp[cubit] = getCubitPosition(cubit); |
|
205 | 204 |
} |
206 | 205 |
|
207 | 206 |
return tmp; |
src/main/java/org/distorted/objects/TwistyCube.java | ||
---|---|---|
136 | 136 |
|
137 | 137 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
138 | 138 |
|
139 |
Static3D[] getCubitPositions(int size)
|
|
139 |
float[][] getCubitPositions(int size)
|
|
140 | 140 |
{ |
141 | 141 |
int numCubits = size>1 ? 6*size*size - 12*size + 8 : 1; |
142 |
Static3D[] tmp = new Static3D[numCubits];
|
|
142 |
float[][] tmp = new float[numCubits][];
|
|
143 | 143 |
|
144 | 144 |
float diff = 0.5f*(size-1); |
145 | 145 |
int currentPosition = 0; |
... | ... | |
149 | 149 |
for(int z = 0; z<size; z++) |
150 | 150 |
if( x==0 || x==size-1 || y==0 || y==size-1 || z==0 || z==size-1 ) |
151 | 151 |
{ |
152 |
tmp[currentPosition++] = new Static3D(x-diff,y-diff,z-diff);
|
|
152 |
tmp[currentPosition++] = new float[] {x-diff,y-diff,z-diff};
|
|
153 | 153 |
} |
154 | 154 |
|
155 | 155 |
return tmp; |
src/main/java/org/distorted/objects/TwistyDiamond.java | ||
---|---|---|
81 | 81 |
private static final float DIST = 0.50f; |
82 | 82 |
|
83 | 83 |
// centers of the 6 octahedrons + 8 tetrahedrons ( i.e. of the all 14 cubits) |
84 |
private static final Static3D[] CENTERS = new Static3D[]
|
|
84 |
private static final float[][] CENTERS = new float[][]
|
|
85 | 85 |
{ |
86 |
new Static3D( DIST, 0, DIST ),
|
|
87 |
new Static3D( DIST, 0,-DIST ),
|
|
88 |
new Static3D(-DIST, 0,-DIST ),
|
|
89 |
new Static3D(-DIST, 0, DIST ),
|
|
90 |
new Static3D( 0, DIST*SQ2 , 0 ),
|
|
91 |
new Static3D( 0,-DIST*SQ2 , 0 ),
|
|
92 |
|
|
93 |
new Static3D( 0, DIST*SQ2/2, DIST ),
|
|
94 |
new Static3D( DIST, DIST*SQ2/2, 0 ),
|
|
95 |
new Static3D( 0, DIST*SQ2/2,-DIST ),
|
|
96 |
new Static3D(-DIST, DIST*SQ2/2, 0 ),
|
|
97 |
new Static3D( 0,-DIST*SQ2/2, DIST ),
|
|
98 |
new Static3D( DIST,-DIST*SQ2/2, 0 ),
|
|
99 |
new Static3D( 0,-DIST*SQ2/2,-DIST ),
|
|
100 |
new Static3D(-DIST,-DIST*SQ2/2, 0 )
|
|
86 |
{ DIST, 0, DIST },
|
|
87 |
{ DIST, 0,-DIST },
|
|
88 |
{-DIST, 0,-DIST },
|
|
89 |
{-DIST, 0, DIST },
|
|
90 |
{ 0, DIST*SQ2 , 0 },
|
|
91 |
{ 0,-DIST*SQ2 , 0 },
|
|
92 |
|
|
93 |
{ 0, DIST*SQ2/2, DIST },
|
|
94 |
{ DIST, DIST*SQ2/2, 0 },
|
|
95 |
{ 0, DIST*SQ2/2,-DIST },
|
|
96 |
{-DIST, DIST*SQ2/2, 0 },
|
|
97 |
{ 0,-DIST*SQ2/2, DIST },
|
|
98 |
{ DIST,-DIST*SQ2/2, 0 },
|
|
99 |
{ 0,-DIST*SQ2/2,-DIST },
|
|
100 |
{-DIST,-DIST*SQ2/2, 0 }
|
|
101 | 101 |
}; |
102 | 102 |
|
103 | 103 |
// Colors of the faces of cubits. Each cubit has 8 faces |
... | ... | |
183 | 183 |
|
184 | 184 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
185 | 185 |
|
186 |
Static3D[] getCubitPositions(int size)
|
|
186 |
float[][] getCubitPositions(int size)
|
|
187 | 187 |
{ |
188 | 188 |
return CENTERS; |
189 | 189 |
} |
src/main/java/org/distorted/objects/TwistyDino.java | ||
---|---|---|
74 | 74 |
}; |
75 | 75 |
|
76 | 76 |
// centers of the 12 edges. Must be in the same order like QUATs above. |
77 |
private static final Static3D[] CENTERS = new Static3D[]
|
|
77 |
private static final float[][] CENTERS = new float[][]
|
|
78 | 78 |
{ |
79 |
new Static3D( 0.0f, 1.5f, 1.5f ),
|
|
80 |
new Static3D( 1.5f, 0.0f, 1.5f ),
|
|
81 |
new Static3D( 0.0f,-1.5f, 1.5f ),
|
|
82 |
new Static3D(-1.5f, 0.0f, 1.5f ),
|
|
83 |
new Static3D( 1.5f, 1.5f, 0.0f ),
|
|
84 |
new Static3D( 1.5f,-1.5f, 0.0f ),
|
|
85 |
new Static3D(-1.5f,-1.5f, 0.0f ),
|
|
86 |
new Static3D(-1.5f, 1.5f, 0.0f ),
|
|
87 |
new Static3D( 0.0f, 1.5f,-1.5f ),
|
|
88 |
new Static3D( 1.5f, 0.0f,-1.5f ),
|
|
89 |
new Static3D( 0.0f,-1.5f,-1.5f ),
|
|
90 |
new Static3D(-1.5f, 0.0f,-1.5f )
|
|
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 | 91 |
}; |
92 | 92 |
|
93 | 93 |
private static MeshBase mMesh; |
... | ... | |
184 | 184 |
|
185 | 185 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
186 | 186 |
|
187 |
Static3D[] getCubitPositions(int size)
|
|
187 |
float[][] getCubitPositions(int size)
|
|
188 | 188 |
{ |
189 | 189 |
return CENTERS; |
190 | 190 |
} |
src/main/java/org/distorted/objects/TwistyHelicopter.java | ||
---|---|---|
97 | 97 |
private static final float XY_CENTER = DIST_CORNER/3; |
98 | 98 |
|
99 | 99 |
// centers of the 8 corners + 6*4 face triangles ( i.e. of the all 32 cubits) |
100 |
private static final Static3D[] CENTERS = new Static3D[]
|
|
100 |
private static final float[][] CENTERS = new float[][]
|
|
101 | 101 |
{ |
102 |
new Static3D( DIST_CORNER, DIST_CORNER, DIST_CORNER ),
|
|
103 |
new Static3D( DIST_CORNER, DIST_CORNER, -DIST_CORNER ),
|
|
104 |
new Static3D( DIST_CORNER, -DIST_CORNER, DIST_CORNER ),
|
|
105 |
new Static3D( DIST_CORNER, -DIST_CORNER, -DIST_CORNER ),
|
|
106 |
new Static3D( -DIST_CORNER, DIST_CORNER, DIST_CORNER ),
|
|
107 |
new Static3D( -DIST_CORNER, DIST_CORNER, -DIST_CORNER ),
|
|
108 |
new Static3D( -DIST_CORNER, -DIST_CORNER, DIST_CORNER ),
|
|
109 |
new Static3D( -DIST_CORNER, -DIST_CORNER, -DIST_CORNER ),
|
|
110 |
|
|
111 |
new Static3D( DIST_CENTER, XY_CENTER, XY_CENTER ),
|
|
112 |
new Static3D( DIST_CENTER, XY_CENTER, -XY_CENTER ),
|
|
113 |
new Static3D( DIST_CENTER, -XY_CENTER, XY_CENTER ),
|
|
114 |
new Static3D( DIST_CENTER, -XY_CENTER, -XY_CENTER ),
|
|
115 |
|
|
116 |
new Static3D( -DIST_CENTER, XY_CENTER, XY_CENTER ),
|
|
117 |
new Static3D( -DIST_CENTER, XY_CENTER, -XY_CENTER ),
|
|
118 |
new Static3D( -DIST_CENTER, -XY_CENTER, XY_CENTER ),
|
|
119 |
new Static3D( -DIST_CENTER, -XY_CENTER, -XY_CENTER ),
|
|
120 |
|
|
121 |
new Static3D( XY_CENTER , DIST_CENTER, XY_CENTER ),
|
|
122 |
new Static3D( XY_CENTER , DIST_CENTER, -XY_CENTER ),
|
|
123 |
new Static3D( -XY_CENTER , DIST_CENTER, XY_CENTER ),
|
|
124 |
new Static3D( -XY_CENTER , DIST_CENTER, -XY_CENTER ),
|
|
125 |
|
|
126 |
new Static3D( XY_CENTER , -DIST_CENTER, XY_CENTER ),
|
|
127 |
new Static3D( XY_CENTER , -DIST_CENTER, -XY_CENTER ),
|
|
128 |
new Static3D( -XY_CENTER , -DIST_CENTER, XY_CENTER ),
|
|
129 |
new Static3D( -XY_CENTER , -DIST_CENTER, -XY_CENTER ),
|
|
130 |
|
|
131 |
new Static3D( XY_CENTER , XY_CENTER, DIST_CENTER ),
|
|
132 |
new Static3D( XY_CENTER , -XY_CENTER, DIST_CENTER ),
|
|
133 |
new Static3D( -XY_CENTER , XY_CENTER, DIST_CENTER ),
|
|
134 |
new Static3D( -XY_CENTER , -XY_CENTER, DIST_CENTER ),
|
|
135 |
|
|
136 |
new Static3D( XY_CENTER , XY_CENTER, -DIST_CENTER ),
|
|
137 |
new Static3D( XY_CENTER , -XY_CENTER, -DIST_CENTER ),
|
|
138 |
new Static3D( -XY_CENTER , XY_CENTER, -DIST_CENTER ),
|
|
139 |
new Static3D( -XY_CENTER , -XY_CENTER, -DIST_CENTER ),
|
|
102 |
{ DIST_CORNER, DIST_CORNER, DIST_CORNER },
|
|
103 |
{ DIST_CORNER, DIST_CORNER, -DIST_CORNER },
|
|
104 |
{ DIST_CORNER, -DIST_CORNER, DIST_CORNER },
|
|
105 |
{ DIST_CORNER, -DIST_CORNER, -DIST_CORNER },
|
|
106 |
{ -DIST_CORNER, DIST_CORNER, DIST_CORNER },
|
|
107 |
{ -DIST_CORNER, DIST_CORNER, -DIST_CORNER },
|
|
108 |
{ -DIST_CORNER, -DIST_CORNER, DIST_CORNER },
|
|
109 |
{ -DIST_CORNER, -DIST_CORNER, -DIST_CORNER },
|
|
110 |
|
|
111 |
{ DIST_CENTER, XY_CENTER, XY_CENTER },
|
|
112 |
{ DIST_CENTER, XY_CENTER, -XY_CENTER },
|
|
113 |
{ DIST_CENTER, -XY_CENTER, XY_CENTER },
|
|
114 |
{ DIST_CENTER, -XY_CENTER, -XY_CENTER },
|
|
115 |
|
|
116 |
{ -DIST_CENTER, XY_CENTER, XY_CENTER },
|
|
117 |
{ -DIST_CENTER, XY_CENTER, -XY_CENTER },
|
|
118 |
{ -DIST_CENTER, -XY_CENTER, XY_CENTER },
|
|
119 |
{ -DIST_CENTER, -XY_CENTER, -XY_CENTER },
|
|
120 |
|
|
121 |
{ XY_CENTER , DIST_CENTER, XY_CENTER },
|
|
122 |
{ XY_CENTER , DIST_CENTER, -XY_CENTER },
|
|
123 |
{ -XY_CENTER , DIST_CENTER, XY_CENTER },
|
|
124 |
{ -XY_CENTER , DIST_CENTER, -XY_CENTER },
|
|
125 |
|
|
126 |
{ XY_CENTER , -DIST_CENTER, XY_CENTER },
|
|
127 |
{ XY_CENTER , -DIST_CENTER, -XY_CENTER },
|
|
128 |
{ -XY_CENTER , -DIST_CENTER, XY_CENTER },
|
|
129 |
{ -XY_CENTER , -DIST_CENTER, -XY_CENTER },
|
|
130 |
|
|
131 |
{ XY_CENTER , XY_CENTER, DIST_CENTER },
|
|
132 |
{ XY_CENTER , -XY_CENTER, DIST_CENTER },
|
|
133 |
{ -XY_CENTER , XY_CENTER, DIST_CENTER },
|
|
134 |
{ -XY_CENTER , -XY_CENTER, DIST_CENTER },
|
|
135 |
|
|
136 |
{ XY_CENTER , XY_CENTER, -DIST_CENTER },
|
|
137 |
{ XY_CENTER , -XY_CENTER, -DIST_CENTER },
|
|
138 |
{ -XY_CENTER , XY_CENTER, -DIST_CENTER },
|
|
139 |
{ -XY_CENTER , -XY_CENTER, -DIST_CENTER },
|
|
140 | 140 |
}; |
141 | 141 |
|
142 | 142 |
// Colors of the faces of cubits. Each cubit has 6 faces |
... | ... | |
251 | 251 |
|
252 | 252 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
253 | 253 |
|
254 |
Static3D[] getCubitPositions(int size)
|
|
254 |
float[][] getCubitPositions(int size)
|
|
255 | 255 |
{ |
256 | 256 |
return CENTERS; |
257 | 257 |
} |
src/main/java/org/distorted/objects/TwistyIvy.java | ||
---|---|---|
156 | 156 |
|
157 | 157 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
158 | 158 |
|
159 |
Static3D[] getCubitPositions(int numLayers)
|
|
159 |
float[][] getCubitPositions(int numLayers)
|
|
160 | 160 |
{ |
161 | 161 |
final float DIST_CORNER = (numLayers-1)*0.50f; |
162 | 162 |
final float DIST_CENTER = (numLayers-1)*0.50f; |
163 | 163 |
|
164 |
final Static3D[] CENTERS = new Static3D[10];
|
|
165 |
|
|
166 |
CENTERS[0] = new Static3D( DIST_CORNER, DIST_CORNER, DIST_CORNER );
|
|
167 |
CENTERS[1] = new Static3D(-DIST_CORNER, DIST_CORNER,-DIST_CORNER );
|
|
168 |
CENTERS[2] = new Static3D(-DIST_CORNER,-DIST_CORNER, DIST_CORNER );
|
|
169 |
CENTERS[3] = new Static3D( DIST_CORNER,-DIST_CORNER,-DIST_CORNER );
|
|
170 |
CENTERS[4] = new Static3D( DIST_CENTER, 0, 0 );
|
|
171 |
CENTERS[5] = new Static3D(-DIST_CENTER, 0, 0 );
|
|
172 |
CENTERS[6] = new Static3D( 0, DIST_CENTER, 0 );
|
|
173 |
CENTERS[7] = new Static3D( 0,-DIST_CENTER, 0 );
|
|
174 |
CENTERS[8] = new Static3D( 0, 0, DIST_CENTER );
|
|
175 |
CENTERS[9] = new Static3D( 0, 0,-DIST_CENTER );
|
|
164 |
final float[][] CENTERS = new float[10][];
|
|
165 |
|
|
166 |
CENTERS[0] = new float[] { DIST_CORNER, DIST_CORNER, DIST_CORNER };
|
|
167 |
CENTERS[1] = new float[] {-DIST_CORNER, DIST_CORNER,-DIST_CORNER };
|
|
168 |
CENTERS[2] = new float[] {-DIST_CORNER,-DIST_CORNER, DIST_CORNER };
|
|
169 |
CENTERS[3] = new float[] { DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
|
|
170 |
CENTERS[4] = new float[] { DIST_CENTER, 0, 0 };
|
|
171 |
CENTERS[5] = new float[] {-DIST_CENTER, 0, 0 };
|
|
172 |
CENTERS[6] = new float[] { 0, DIST_CENTER, 0 };
|
|
173 |
CENTERS[7] = new float[] { 0,-DIST_CENTER, 0 };
|
|
174 |
CENTERS[8] = new float[] { 0, 0, DIST_CENTER };
|
|
175 |
CENTERS[9] = new float[] { 0, 0,-DIST_CENTER };
|
|
176 | 176 |
|
177 | 177 |
return CENTERS; |
178 | 178 |
} |
src/main/java/org/distorted/objects/TwistyKilominx.java | ||
---|---|---|
62 | 62 |
|
63 | 63 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
64 | 64 |
|
65 |
Static3D[] getCubitPositions(int numLayers)
|
|
65 |
float[][] getCubitPositions(int numLayers)
|
|
66 | 66 |
{ |
67 | 67 |
return CORNERS; |
68 | 68 |
} |
src/main/java/org/distorted/objects/TwistyMegaminx.java | ||
---|---|---|
125 | 125 |
{ |
126 | 126 |
int[] map = mCenterMap[center]; |
127 | 127 |
|
128 |
float x = CORNERS[map[0]].get0() +
|
|
129 |
CORNERS[map[1]].get0() +
|
|
130 |
CORNERS[map[2]].get0() +
|
|
131 |
CORNERS[map[3]].get0() +
|
|
132 |
CORNERS[map[4]].get0() ;
|
|
133 |
|
|
134 |
float y = CORNERS[map[0]].get1() +
|
|
135 |
CORNERS[map[1]].get1() +
|
|
136 |
CORNERS[map[2]].get1() +
|
|
137 |
CORNERS[map[3]].get1() +
|
|
138 |
CORNERS[map[4]].get1() ;
|
|
139 |
|
|
140 |
float z = CORNERS[map[0]].get2() +
|
|
141 |
CORNERS[map[1]].get2() +
|
|
142 |
CORNERS[map[2]].get2() +
|
|
143 |
CORNERS[map[3]].get2() +
|
|
144 |
CORNERS[map[4]].get2() ;
|
|
128 |
float x = CORNERS[map[0]][0] +
|
|
129 |
CORNERS[map[1]][0] +
|
|
130 |
CORNERS[map[2]][0] +
|
|
131 |
CORNERS[map[3]][0] +
|
|
132 |
CORNERS[map[4]][0] ;
|
|
133 |
|
|
134 |
float y = CORNERS[map[0]][1] +
|
|
135 |
CORNERS[map[1]][1] +
|
|
136 |
CORNERS[map[2]][1] +
|
|
137 |
CORNERS[map[3]][1] +
|
|
138 |
CORNERS[map[4]][1] ;
|
|
139 |
|
|
140 |
float z = CORNERS[map[0]][2] +
|
|
141 |
CORNERS[map[1]][2] +
|
|
142 |
CORNERS[map[2]][2] +
|
|
143 |
CORNERS[map[3]][2] +
|
|
144 |
CORNERS[map[4]][2] ;
|
|
145 | 145 |
|
146 | 146 |
mCenterCoords[center][0] = x/5; |
147 | 147 |
mCenterCoords[center][1] = y/5; |
... | ... | |
225 | 225 |
|
226 | 226 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
227 | 227 |
|
228 |
private void computeCenter(Static3D pos, int center, int numLayers)
|
|
228 |
private float[] computeCenter(int center, int numLayers)
|
|
229 | 229 |
{ |
230 | 230 |
float[] coords = mCenterCoords[center]; |
231 | 231 |
float A = numLayers/3.0f; |
232 | 232 |
|
233 |
pos.set( A*coords[0], A*coords[1], A*coords[2] );
|
|
233 |
return new float[] { A*coords[0], A*coords[1], A*coords[2] };
|
|
234 | 234 |
} |
235 | 235 |
|
236 | 236 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
248 | 248 |
|
249 | 249 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
250 | 250 |
|
251 |
private void computeCorner(Static3D pos, int numCubitsPerCorner, int numLayers, int corner, int part)
|
|
251 |
private float[] computeCorner(int numCubitsPerCorner, int numLayers, int corner, int part)
|
|
252 | 252 |
{ |
253 | 253 |
float D = numLayers/3.0f; |
254 |
Static3D corn = CORNERS[corner];
|
|
254 |
float[] corn = CORNERS[corner];
|
|
255 | 255 |
|
256 | 256 |
if( part==0 ) |
257 | 257 |
{ |
258 |
pos.set( corn.get0()*D, corn.get1()*D, corn.get2()*D );
|
|
258 |
return new float[] { corn[0]*D, corn[1]*D, corn[2]*D };
|
|
259 | 259 |
} |
260 | 260 |
else |
261 | 261 |
{ |
... | ... | |
269 | 269 |
int multP = (block % ((numLayers-3)/2)) + 1; |
270 | 270 |
int multS = (block / ((numLayers-3)/2)); |
271 | 271 |
|
272 |
pos.set( corn.get0()*D + (pri.get0()*multP + sec.get0()*multS)*E, |
|
273 |
corn.get1()*D + (pri.get1()*multP + sec.get1()*multS)*E, |
|
274 |
corn.get2()*D + (pri.get2()*multP + sec.get2()*multS)*E ); |
|
272 |
return new float[] { |
|
273 |
corn[0]*D + (pri.get0()*multP + sec.get0()*multS)*E, |
|
274 |
corn[1]*D + (pri.get1()*multP + sec.get1()*multS)*E, |
|
275 |
corn[2]*D + (pri.get2()*multP + sec.get2()*multS)*E |
|
276 |
}; |
|
275 | 277 |
} |
276 | 278 |
} |
277 | 279 |
|
... | ... | |
285 | 287 |
|
286 | 288 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
287 | 289 |
|
288 |
private void computeEdge(Static3D pos, int numLayers, int edge, int part)
|
|
290 |
private float[] computeEdge(int numLayers, int edge, int part)
|
|
289 | 291 |
{ |
290 | 292 |
float corr = numLayers/3.0f; |
291 | 293 |
|
292 |
Static3D c1 = CORNERS[ mEdgeMap[edge][0] ];
|
|
293 |
Static3D c2 = CORNERS[ mEdgeMap[edge][1] ];
|
|
294 |
float x = corr*(c1.get0() + c2.get0())/2;
|
|
295 |
float y = corr*(c1.get1() + c2.get1())/2;
|
|
296 |
float z = corr*(c1.get2() + c2.get2())/2;
|
|
294 |
float[] c1 = CORNERS[ mEdgeMap[edge][0] ];
|
|
295 |
float[] c2 = CORNERS[ mEdgeMap[edge][1] ];
|
|
296 |
float x = corr * (c1[0]+c2[0]) / 2;
|
|
297 |
float y = corr * (c1[1]+c2[1]) / 2;
|
|
298 |
float z = corr * (c1[2]+c2[2]) / 2;
|
|
297 | 299 |
|
298 | 300 |
if( part==0 ) |
299 | 301 |
{ |
300 |
pos.set(x,y,z);
|
|
302 |
return new float[] { x, y, z };
|
|
301 | 303 |
} |
302 | 304 |
else |
303 | 305 |
{ |
... | ... | |
312 | 314 |
float len = (float)Math.sqrt(vX*vX+vY*vY+vZ*vZ); |
313 | 315 |
float A = mult*corr*(0.5f-MEGA_D)*COS18/((numLayers-1)*0.5f)/len; |
314 | 316 |
|
315 |
pos.set( x+A*vX, y+A*vY, z+A*vZ );
|
|
317 |
return new float[] { x+A*vX, y+A*vY, z+A*vZ };
|
|
316 | 318 |
} |
317 | 319 |
} |
318 | 320 |
|
319 | 321 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
320 | 322 |
|
321 |
Static3D[] getCubitPositions(int numLayers)
|
|
323 |
float[][] getCubitPositions(int numLayers)
|
|
322 | 324 |
{ |
323 | 325 |
int numCubitsPerCorner = numCubitsPerCorner(numLayers); |
324 | 326 |
int numCubitsPerEdge = numCubitsPerEdge(numLayers); |
325 | 327 |
int numCubits = NUM_CORNERS*numCubitsPerCorner + NUM_EDGES*numCubitsPerEdge + NUM_CENTERS; |
326 | 328 |
int index=0; |
327 | 329 |
|
328 |
final Static3D[] CENTERS = new Static3D[numCubits];
|
|
330 |
final float[][] CENTERS = new float[numCubits][];
|
|
329 | 331 |
|
330 | 332 |
for(int corner=0; corner<NUM_CORNERS; corner++) |
331 | 333 |
{ |
... | ... | |
333 | 335 |
|
334 | 336 |
for(int part=0; part<numCubitsPerCorner; part++, index++) |
335 | 337 |
{ |
336 |
CENTERS[index] = new Static3D(0,0,0); |
|
337 |
computeCorner(CENTERS[index],numCubitsPerCorner,numLayers,corner,part); |
|
338 |
CENTERS[index] = computeCorner(numCubitsPerCorner,numLayers,corner,part); |
|
338 | 339 |
} |
339 | 340 |
} |
340 | 341 |
|
... | ... | |
342 | 343 |
{ |
343 | 344 |
for(int part=0; part<numCubitsPerEdge; part++, index++) |
344 | 345 |
{ |
345 |
CENTERS[index] = new Static3D(0,0,0); |
|
346 |
computeEdge(CENTERS[index], numLayers, edge, part ); |
|
346 |
CENTERS[index] = computeEdge(numLayers, edge, part ); |
|
347 | 347 |
} |
348 | 348 |
} |
349 | 349 |
|
350 | 350 |
for(int center=0; center<NUM_CENTERS; center++, index++) |
351 | 351 |
{ |
352 |
CENTERS[index] = new Static3D(0,0,0); |
|
353 |
computeCenter(CENTERS[index], center, numLayers); |
|
352 |
CENTERS[index] = computeCenter(center, numLayers); |
|
354 | 353 |
} |
355 | 354 |
|
356 | 355 |
return CENTERS; |
src/main/java/org/distorted/objects/TwistyMinx.java | ||
---|---|---|
144 | 144 |
}; |
145 | 145 |
|
146 | 146 |
// Coordinates of all 20 corners of a Minx |
147 |
static final Static3D[] CORNERS = new Static3D[]
|
|
147 |
static final float[][] CORNERS = new float[][]
|
|
148 | 148 |
{ |
149 |
new Static3D( 0.0f, 0.5f, C2),
|
|
150 |
new Static3D( 0.0f, 0.5f, -C2),
|
|
151 |
new Static3D( 0.0f,-0.5f, C2),
|
|
152 |
new Static3D( 0.0f,-0.5f, -C2),
|
|
153 |
new Static3D( C2, 0.0f, 0.5f),
|
|
154 |
new Static3D( C2, 0.0f,-0.5f),
|
|
155 |
new Static3D( -C2, 0.0f, 0.5f),
|
|
156 |
new Static3D( -C2, 0.0f,-0.5f),
|
|
157 |
new Static3D( 0.5f, C2, 0.0f),
|
|
158 |
new Static3D( 0.5f, -C2, 0.0f),
|
|
159 |
new Static3D(-0.5f, C2, 0.0f),
|
|
160 |
new Static3D(-0.5f, -C2, 0.0f),
|
|
161 |
new Static3D( C1, C1, C1),
|
|
162 |
new Static3D( C1, C1, -C1),
|
|
163 |
new Static3D( C1, -C1, C1),
|
|
164 |
new Static3D( C1, -C1, -C1),
|
|
165 |
new Static3D( -C1, C1, C1),
|
|
166 |
new Static3D( -C1, C1, -C1),
|
|
167 |
new Static3D( -C1, -C1, C1),
|
|
168 |
new Static3D( -C1, -C1, -C1),
|
|
149 |
{ 0.0f, 0.5f, C2},
|
|
150 |
{ 0.0f, 0.5f, -C2},
|
|
151 |
{ 0.0f,-0.5f, C2},
|
|
152 |
{ 0.0f,-0.5f, -C2},
|
|
153 |
{ C2, 0.0f, 0.5f},
|
|
154 |
{ C2, 0.0f,-0.5f},
|
|
155 |
{ -C2, 0.0f, 0.5f},
|
|
156 |
{ -C2, 0.0f,-0.5f},
|
|
157 |
{ 0.5f, C2, 0.0f},
|
|
158 |
{ 0.5f, -C2, 0.0f},
|
|
159 |
{-0.5f, C2, 0.0f},
|
|
160 |
{-0.5f, -C2, 0.0f},
|
|
161 |
{ C1, C1, C1},
|
|
162 |
{ C1, C1, -C1},
|
|
163 |
{ C1, -C1, C1},
|
|
164 |
{ C1, -C1, -C1},
|
|
165 |
{ -C1, C1, C1},
|
|
166 |
{ -C1, C1, -C1},
|
|
167 |
{ -C1, -C1, C1},
|
|
168 |
{ -C1, -C1, -C1},
|
|
169 | 169 |
}; |
170 | 170 |
|
171 | 171 |
static final int[][] mCornerFaceMap = |
src/main/java/org/distorted/objects/TwistyObject.java | ||
---|---|---|
98 | 98 |
|
99 | 99 |
private static float mInitScreenRatio; |
100 | 100 |
private static float mObjectScreenRatio = 1.0f; |
101 |
private static final float[] mTmp1 = new float[4]; |
|
102 |
private static final float[] mTmp2 = new float[4]; |
|
101 | 103 |
|
102 | 104 |
private final int mNodeSize; |
103 |
private final Static3D[] mOrigPos;
|
|
105 |
private final float[][] mOrigPos;
|
|
104 | 106 |
private final Static3D mNodeScale; |
105 | 107 |
private final Static4D mQuat; |
106 | 108 |
private final int mNumLayers, mRealSize; |
... | ... | |
214 | 216 |
setProjection( fov, 0.1f); |
215 | 217 |
} |
216 | 218 |
|
219 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
220 |
|
|
221 |
private Static3D getPos(float[] origPos) |
|
222 |
{ |
|
223 |
int len = origPos.length/3; |
|
224 |
float sumX = 0.0f; |
|
225 |
float sumY = 0.0f; |
|
226 |
float sumZ = 0.0f; |
|
227 |
|
|
228 |
for(int i=0; i<len; i++) |
|
229 |
{ |
|
230 |
sumX += origPos[3*i ]; |
|
231 |
sumY += origPos[3*i+1]; |
|
232 |
sumZ += origPos[3*i+2]; |
|
233 |
} |
|
234 |
|
|
235 |
sumX /= len; |
|
236 |
sumY /= len; |
|
237 |
sumZ /= len; |
|
238 |
|
|
239 |
return new Static3D(sumX,sumY,sumZ); |
|
240 |
} |
|
241 |
|
|
217 | 242 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
218 | 243 |
|
219 | 244 |
private void createMeshAndCubits(ObjectList list, Resources res) |
... | ... | |
252 | 277 |
{ |
253 | 278 |
CUBITS[i] = new Cubit(this,mOrigPos[i]); |
254 | 279 |
cubitMesh[i] = createCubitMesh(i,mNumLayers); |
255 |
cubitMesh[i].apply(new MatrixEffectMove(mOrigPos[i]),1,0); |
|
280 |
Static3D pos = getPos(mOrigPos[i]); |
|
281 |
cubitMesh[i].apply(new MatrixEffectMove(pos),1,0); |
|
256 | 282 |
cubitMesh[i].setEffectAssociation(0, CUBITS[i].computeAssociation(), 0); |
257 | 283 |
} |
258 | 284 |
|
... | ... | |
283 | 309 |
|
284 | 310 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
285 | 311 |
|
286 |
int computeRow(float x, float y, float z, int rotIndex)
|
|
312 |
int computeRow(float[] pos, int rotIndex)
|
|
287 | 313 |
{ |
314 |
int ret=0; |
|
315 |
int len = pos.length / 3; |
|
288 | 316 |
Static3D axis = ROTATION_AXIS[rotIndex]; |
289 |
float tmp = x*axis.get0() + y*axis.get1() + z*axis.get2(); |
|
317 |
float axisX = axis.get0(); |
|
318 |
float axisY = axis.get1(); |
|
319 |
float axisZ = axis.get2(); |
|
320 |
|
|
321 |
for(int i=0; i<len; i++) |
|
322 |
{ |
|
323 |
ret |= computeRow(pos[3*i]*axisX + pos[3*i+1]*axisY + pos[3*i+2]*axisZ); |
|
324 |
} |
|
325 |
|
|
326 |
return ret; |
|
327 |
} |
|
328 |
|
|
329 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
290 | 330 |
|
331 |
private int computeRow(float casted) |
|
332 |
{ |
|
291 | 333 |
for(int i=0; i<NUM_CUTS; i++) |
292 | 334 |
{ |
293 |
if( tmp<CUTS[i] ) return (1<<i);
|
|
335 |
if( casted<CUTS[i] ) return (1<<i);
|
|
294 | 336 |
} |
295 | 337 |
|
296 | 338 |
return (1<<NUM_CUTS); |
... | ... | |
369 | 411 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
370 | 412 |
// Clamp all rotated positions to one of those original ones to avoid accumulating errors. |
371 | 413 |
|
372 |
void clampPos(Static3D pos)
|
|
414 |
void clampPos(float[] pos, int offset)
|
|
373 | 415 |
{ |
374 | 416 |
float currError, minError = Float.MAX_VALUE; |
375 |
int minErrorIndex= -1; |
|
376 |
float x = pos.get0(); |
|
377 |
float y = pos.get1(); |
|
378 |
float z = pos.get2(); |
|
417 |
int minErrorIndex1 = -1; |
|
418 |
int minErrorIndex2 = -1; |
|
419 |
|
|
420 |
float x = pos[offset ]; |
|
421 |
float y = pos[offset+1]; |
|
422 |
float z = pos[offset+2]; |
|
423 |
|
|
379 | 424 |
float xo,yo,zo; |
380 | 425 |
|
381 | 426 |
for(int i=0; i<NUM_CUBITS; i++) |
382 | 427 |
{ |
383 |
xo = mOrigPos[i].get0(); |
|
384 |
yo = mOrigPos[i].get1(); |
|
385 |
zo = mOrigPos[i].get2(); |
|
428 |
int len = mOrigPos[i].length / 3; |
|
386 | 429 |
|
387 |
currError = (xo-x)*(xo-x) + (yo-y)*(yo-y) + (zo-z)*(zo-z); |
|
388 |
|
|
389 |
if( currError<minError ) |
|
430 |
for(int j=0; j<len; j++) |
|
390 | 431 |
{ |
391 |
minError = currError; |
|
392 |
minErrorIndex = i; |
|
432 |
xo = mOrigPos[i][3*j ]; |
|
433 |
yo = mOrigPos[i][3*j+1]; |
|
434 |
zo = mOrigPos[i][3*j+2]; |
|
435 |
|
|
436 |
currError = (xo-x)*(xo-x) + (yo-y)*(yo-y) + (zo-z)*(zo-z); |
|
437 |
|
|
438 |
if( currError<minError ) |
|
439 |
{ |
|
440 |
minError = currError; |
|
441 |
minErrorIndex1 = i; |
|
442 |
minErrorIndex2 = j; |
|
443 |
} |
|
393 | 444 |
} |
394 | 445 |
} |
395 | 446 |
|
396 |
pos.set( mOrigPos[minErrorIndex] ); |
|
447 |
pos[offset ] = mOrigPos[minErrorIndex1][3*minErrorIndex2 ]; |
|
448 |
pos[offset+1] = mOrigPos[minErrorIndex1][3*minErrorIndex2+1]; |
|
449 |
pos[offset+2] = mOrigPos[minErrorIndex1][3*minErrorIndex2+2]; |
|
397 | 450 |
} |
398 | 451 |
|
399 | 452 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
422 | 475 |
{ |
423 | 476 |
case 0 : return false; // 'inside' cubit that does not lie on any face |
424 | 477 |
case 1 : // cubit that lies inside one of the faces |
425 |
Static3D orig = cubit.getOrigPosition();
|
|
478 |
float[] orig = cubit.getOrigPosition();
|
|
426 | 479 |
Static4D quat1 = QUATS[quatIndex]; |
427 | 480 |
Static4D quat2 = QUATS[cubit.mQuatIndex]; |
428 | 481 |
|
429 |
Static4D cubitCenter = new Static4D( orig.get0(), orig.get1(), orig.get2(), 0);
|
|
430 |
Static4D rotated1 = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat1 ); |
|
482 |
Static4D cubitCenter = new Static4D( orig[0], orig[1], orig[2], 0); // not used for bandaged objects,
|
|
483 |
Static4D rotated1 = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat1 ); // only check the first position
|
|
431 | 484 |
Static4D rotated2 = RubikSurfaceView.rotateVectorByQuat( cubitCenter, quat2 ); |
432 | 485 |
|
433 |
int row1, row2; |
|
434 |
float x1 = rotated1.get0(); |
|
435 |
float y1 = rotated1.get1(); |
|
436 |
float z1 = rotated1.get2(); |
|
437 |
float x2 = rotated2.get0(); |
|
438 |
float y2 = rotated2.get1(); |
|
439 |
float z2 = rotated2.get2(); |
|
486 |
rotated1.get(mTmp1, 0, 0, 0); |
|
487 |
rotated2.get(mTmp2, 0, 0, 0); |
|
440 | 488 |
|
441 | 489 |
for(int i=0; i<NUM_AXIS; i++) |
442 | 490 |
{ |
443 |
row1 = computeRow(x1,y1,z1,i); |
|
444 |
row2 = computeRow(x2,y2,z2,i); |
|
445 |
|
|
446 |
if( ((row1 & row2) & bitmap) != 0 ) return false; |
|
491 |
if( (computeRow(mTmp1,i) & computeRow(mTmp2,i) & bitmap) != 0 ) return false; |
|
447 | 492 |
} |
448 | 493 |
return true; |
449 | 494 |
|
... | ... | |
843 | 888 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
844 | 889 |
|
845 | 890 |
abstract float getScreenRatio(); |
846 |
abstract Static3D[] getCubitPositions(int numLayers);
|
|
891 |
abstract float[][] getCubitPositions(int numLayers);
|
|
847 | 892 |
abstract Static4D[] getQuats(); |
848 | 893 |
abstract int getNumFaces(); |
849 | 894 |
abstract int getNumStickerTypes(int numLayers); |
src/main/java/org/distorted/objects/TwistyPyraminx.java | ||
---|---|---|
82 | 82 |
|
83 | 83 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
84 | 84 |
|
85 |
private void addTetrahedralLattice(int size, int index, Static3D[] pos)
|
|
85 |
private void addTetrahedralLattice(int size, int index, float[][] pos)
|
|
86 | 86 |
{ |
87 | 87 |
final float DX = 1.0f; |
88 | 88 |
final float DY = SQ2/2; |
... | ... | |
103 | 103 |
|
104 | 104 |
for(int z=0; z<size-layer; z++) |
105 | 105 |
{ |
106 |
pos[index] = new Static3D(currX,currY,currZ);
|
|
106 |
pos[index] = new float[] {currX,currY,currZ};
|
|
107 | 107 |
index++; |
108 | 108 |
currZ -= DZ; |
109 | 109 |
} |
... | ... | |
120 | 120 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
121 | 121 |
// there are (n^3-n)/6 octahedrons and ((n+1)^3 - (n+1))/6 tetrahedrons |
122 | 122 |
|
123 |
Static3D[] getCubitPositions(int size)
|
|
123 |
float[][] getCubitPositions(int size)
|
|
124 | 124 |
{ |
125 | 125 |
int numOcta = (size-1)*size*(size+1)/6; |
126 | 126 |
int numTetra= size*(size+1)*(size+2)/6; |
127 |
Static3D[] ret = new Static3D[numOcta+numTetra];
|
|
127 |
float[][] ret = new float[numOcta+numTetra][];
|
|
128 | 128 |
|
129 | 129 |
addTetrahedralLattice(size-1, 0,ret); |
130 | 130 |
addTetrahedralLattice(size ,numOcta,ret); |
src/main/java/org/distorted/objects/TwistyRedi.java | ||
---|---|---|
80 | 80 |
private static final float DIST_EDGE = 1.5f; |
81 | 81 |
|
82 | 82 |
// centers of the 8 corners + 12 edges ( i.e. of the all 20 cubits) |
83 |
private static final Static3D[] CENTERS = new Static3D[]
|
|
83 |
private static final float[][] CENTERS = new float[][]
|
|
84 | 84 |
{ |
85 |
new Static3D( DIST_CORNER, DIST_CORNER, DIST_CORNER ),
|
|
86 |
new Static3D( DIST_CORNER, DIST_CORNER,-DIST_CORNER ),
|
|
87 |
new Static3D( DIST_CORNER,-DIST_CORNER, DIST_CORNER ),
|
|
88 |
new Static3D( DIST_CORNER,-DIST_CORNER,-DIST_CORNER ),
|
|
89 |
new Static3D(-DIST_CORNER, DIST_CORNER, DIST_CORNER ),
|
|
90 |
new Static3D(-DIST_CORNER, DIST_CORNER,-DIST_CORNER ),
|
|
91 |
new Static3D(-DIST_CORNER,-DIST_CORNER, DIST_CORNER ),
|
|
92 |
new Static3D(-DIST_CORNER,-DIST_CORNER,-DIST_CORNER ),
|
|
93 |
|
|
94 |
new Static3D( 0.0f, DIST_EDGE, DIST_EDGE ),
|
|
95 |
new Static3D( DIST_EDGE, 0.0f, DIST_EDGE ),
|
|
96 |
new Static3D( 0.0f,-DIST_EDGE, DIST_EDGE ),
|
|
97 |
new Static3D(-DIST_EDGE, 0.0f, DIST_EDGE ),
|
|
98 |
new Static3D( DIST_EDGE, DIST_EDGE, 0.0f ),
|
|
99 |
new Static3D( DIST_EDGE,-DIST_EDGE, 0.0f ),
|
|
100 |
new Static3D(-DIST_EDGE,-DIST_EDGE, 0.0f ),
|
|
101 |
new Static3D(-DIST_EDGE, DIST_EDGE, 0.0f ),
|
|
102 |
new Static3D( 0.0f, DIST_EDGE,-DIST_EDGE ),
|
|
103 |
new Static3D( DIST_EDGE, 0.0f,-DIST_EDGE ),
|
|
104 |
new Static3D( 0.0f,-DIST_EDGE,-DIST_EDGE ),
|
|
105 |
new Static3D(-DIST_EDGE, 0.0f,-DIST_EDGE )
|
|
85 |
{ DIST_CORNER, DIST_CORNER, DIST_CORNER },
|
|
86 |
{ DIST_CORNER, DIST_CORNER,-DIST_CORNER },
|
|
87 |
{ DIST_CORNER,-DIST_CORNER, DIST_CORNER },
|
|
88 |
{ DIST_CORNER,-DIST_CORNER,-DIST_CORNER },
|
|
89 |
{-DIST_CORNER, DIST_CORNER, DIST_CORNER },
|
|
90 |
{-DIST_CORNER, DIST_CORNER,-DIST_CORNER },
|
|
91 |
{-DIST_CORNER,-DIST_CORNER, DIST_CORNER },
|
|
92 |
{-DIST_CORNER,-DIST_CORNER,-DIST_CORNER },
|
|
93 |
|
|
94 |
{ 0.0f, DIST_EDGE, DIST_EDGE },
|
|
95 |
{ DIST_EDGE, 0.0f, DIST_EDGE },
|
|
96 |
{ 0.0f,-DIST_EDGE, DIST_EDGE },
|
|
97 |
{-DIST_EDGE, 0.0f, DIST_EDGE },
|
|
98 |
{ DIST_EDGE, DIST_EDGE, 0.0f },
|
|
99 |
{ DIST_EDGE,-DIST_EDGE, 0.0f },
|
|
100 |
{-DIST_EDGE,-DIST_EDGE, 0.0f },
|
|
101 |
{-DIST_EDGE, DIST_EDGE, 0.0f },
|
|
102 |
{ 0.0f, DIST_EDGE,-DIST_EDGE },
|
|
103 |
{ DIST_EDGE, 0.0f,-DIST_EDGE },
|
|
104 |
{ 0.0f,-DIST_EDGE,-DIST_EDGE },
|
|
105 |
{-DIST_EDGE, 0.0f,-DIST_EDGE }
|
|
106 | 106 |
}; |
107 | 107 |
|
108 | 108 |
// Colors of the faces of cubits. |
... | ... | |
199 | 199 |
|
200 | 200 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
201 | 201 |
|
202 |
Static3D[] getCubitPositions(int size)
|
|
202 |
float[][] getCubitPositions(int size)
|
|
203 | 203 |
{ |
204 | 204 |
return CENTERS; |
205 | 205 |
} |
src/main/java/org/distorted/objects/TwistyRex.java | ||
---|---|---|
189 | 189 |
|
190 | 190 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
191 | 191 |
|
192 |
Static3D[] getCubitPositions(int numLayers)
|
|
192 |
float[][] getCubitPositions(int numLayers)
|
|
193 | 193 |
{ |
194 | 194 |
final float DIST = 0.50f; |
195 | 195 |
final float DIST2= (1+2*REX_D)/6; |
196 | 196 |
|
197 |
final Static3D[] CENTERS = new Static3D[42];
|
|
198 |
|
|
199 |
CENTERS[ 0] = new Static3D( +DIST , +DIST2, +DIST2);
|
|
200 |
CENTERS[ 1] = new Static3D( +DIST , +DIST2, -DIST2);
|
|
201 |
CENTERS[ 2] = new Static3D( +DIST , -DIST2, -DIST2);
|
|
202 |
CENTERS[ 3] = new Static3D( +DIST , -DIST2, +DIST2);
|
|
203 |
CENTERS[ 4] = new Static3D( -DIST , +DIST2, +DIST2);
|
|
204 |
CENTERS[ 5] = new Static3D( -DIST , +DIST2, -DIST2);
|
|
205 |
CENTERS[ 6] = new Static3D( -DIST , -DIST2, -DIST2);
|
|
206 |
CENTERS[ 7] = new Static3D( -DIST , -DIST2, +DIST2);
|
|
207 |
CENTERS[ 8] = new Static3D( +DIST2, +DIST , +DIST2);
|
|
208 |
CENTERS[ 9] = new Static3D( +DIST2, +DIST , -DIST2);
|
|
209 |
CENTERS[10] = new Static3D( -DIST2, +DIST , -DIST2);
|
|
210 |
CENTERS[11] = new Static3D( -DIST2, +DIST , +DIST2);
|
|
211 |
CENTERS[12] = new Static3D( +DIST2, -DIST , +DIST2);
|
|
212 |
CENTERS[13] = new Static3D( +DIST2, -DIST , -DIST2);
|
|
213 |
CENTERS[14] = new Static3D( -DIST2, -DIST , -DIST2);
|
|
214 |
CENTERS[15] = new Static3D( -DIST2, -DIST , +DIST2);
|
|
215 |
CENTERS[16] = new Static3D( +DIST2, +DIST2, +DIST );
|
|
216 |
CENTERS[17] = new Static3D( +DIST2, -DIST2, +DIST );
|
|
217 |
CENTERS[18] = new Static3D( -DIST2, -DIST2, +DIST );
|
|
218 |
CENTERS[19] = new Static3D( -DIST2, +DIST2, +DIST );
|
|
219 |
CENTERS[20] = new Static3D( +DIST2, +DIST2, -DIST );
|
|
220 |
CENTERS[21] = new Static3D( +DIST2, -DIST2, -DIST );
|
|
221 |
CENTERS[22] = new Static3D( -DIST2, -DIST2, -DIST );
|
|
222 |
CENTERS[23] = new Static3D( -DIST2, +DIST2, -DIST );
|
|
223 |
|
|
224 |
CENTERS[24] = new Static3D( +DIST , +0.00f, +0.00f);
|
|
225 |
CENTERS[25] = new Static3D( -DIST , +0.00f, +0.00f);
|
|
226 |
CENTERS[26] = new Static3D( +0.00f, +DIST , +0.00f);
|
|
227 |
CENTERS[27] = new Static3D( +0.00f, -DIST , +0.00f);
|
|
228 |
CENTERS[28] = new Static3D( +0.00f, +0.00f, +DIST );
|
|
229 |
CENTERS[29] = new Static3D( +0.00f, +0.00f, -DIST );
|
|
230 |
|
|
231 |
CENTERS[30] = new Static3D( +0.00f, +DIST , +DIST );
|
|
232 |
CENTERS[31] = new Static3D( +DIST , +0.00f, +DIST );
|
|
233 |
CENTERS[32] = new Static3D( +0.00f, -DIST , +DIST );
|
|
234 |
CENTERS[33] = new Static3D( -DIST , +0.00f, +DIST );
|
|
235 |
CENTERS[34] = new Static3D( +DIST , +DIST , +0.00f);
|
|
236 |
CENTERS[35] = new Static3D( +DIST , -DIST , +0.00f);
|
|
237 |
CENTERS[36] = new Static3D( -DIST , -DIST , +0.00f);
|
|
238 |
CENTERS[37] = new Static3D( -DIST , +DIST , +0.00f);
|
|
239 |
CENTERS[38] = new Static3D( +0.00f, +DIST , -DIST );
|
|
240 |
CENTERS[39] = new Static3D( +DIST , +0.00f, -DIST );
|
|
241 |
CENTERS[40] = new Static3D( +0.00f, -DIST , -DIST );
|
|
242 |
CENTERS[41] = new Static3D( -DIST , +0.00f, -DIST );
|
|
197 |
final float[][] CENTERS = new float[42][];
|
|
198 |
|
|
199 |
CENTERS[ 0] = new float[] { +DIST , +DIST2, +DIST2};
|
|
200 |
CENTERS[ 1] = new float[] { +DIST , +DIST2, -DIST2};
|
|
201 |
CENTERS[ 2] = new float[] { +DIST , -DIST2, -DIST2};
|
|
202 |
CENTERS[ 3] = new float[] { +DIST , -DIST2, +DIST2};
|
|
203 |
CENTERS[ 4] = new float[] { -DIST , +DIST2, +DIST2};
|
|
204 |
CENTERS[ 5] = new float[] { -DIST , +DIST2, -DIST2};
|
|
205 |
CENTERS[ 6] = new float[] { -DIST , -DIST2, -DIST2};
|
|
206 |
CENTERS[ 7] = new float[] { -DIST , -DIST2, +DIST2};
|
|
207 |
CENTERS[ 8] = new float[] { +DIST2, +DIST , +DIST2};
|
|
208 |
CENTERS[ 9] = new float[] { +DIST2, +DIST , -DIST2};
|
|
209 |
CENTERS[10] = new float[] { -DIST2, +DIST , -DIST2};
|
|
210 |
CENTERS[11] = new float[] { -DIST2, +DIST , +DIST2};
|
|
211 |
CENTERS[12] = new float[] { +DIST2, -DIST , +DIST2};
|
|
212 |
CENTERS[13] = new float[] { +DIST2, -DIST , -DIST2};
|
|
213 |
CENTERS[14] = new float[] { -DIST2, -DIST , -DIST2};
|
|
214 |
CENTERS[15] = new float[] { -DIST2, -DIST , +DIST2};
|
|
215 |
CENTERS[16] = new float[] { +DIST2, +DIST2, +DIST };
|
|
216 |
CENTERS[17] = new float[] { +DIST2, -DIST2, +DIST };
|
|
217 |
CENTERS[18] = new float[] { -DIST2, -DIST2, +DIST };
|
|
218 |
CENTERS[19] = new float[] { -DIST2, +DIST2, +DIST };
|
|
219 |
CENTERS[20] = new float[] { +DIST2, +DIST2, -DIST };
|
|
220 |
CENTERS[21] = new float[] { +DIST2, -DIST2, -DIST };
|
|
221 |
CENTERS[22] = new float[] { -DIST2, -DIST2, -DIST };
|
|
222 |
CENTERS[23] = new float[] { -DIST2, +DIST2, -DIST };
|
|
223 |
|
|
224 |
CENTERS[24] = new float[] { +DIST , +0.00f, +0.00f};
|
|
225 |
CENTERS[25] = new float[] { -DIST , +0.00f, +0.00f};
|
|
226 |
CENTERS[26] = new float[] { +0.00f, +DIST , +0.00f};
|
|
227 |
CENTERS[27] = new float[] { +0.00f, -DIST , +0.00f};
|
|
228 |
CENTERS[28] = new float[] { +0.00f, +0.00f, +DIST };
|
|
229 |
CENTERS[29] = new float[] { +0.00f, +0.00f, -DIST };
|
|
230 |
|
|
231 |
CENTERS[30] = new float[] { +0.00f, +DIST , +DIST };
|
|
232 |
CENTERS[31] = new float[] { +DIST , +0.00f, +DIST };
|
|
233 |
CENTERS[32] = new float[] { +0.00f, -DIST , +DIST };
|
|
234 |
CENTERS[33] = new float[] { -DIST , +0.00f, +DIST };
|
|
235 |
CENTERS[34] = new float[] { +DIST , +DIST , +0.00f};
|
|
236 |
CENTERS[35] = new float[] { +DIST , -DIST , +0.00f};
|
|
237 |
CENTERS[36] = new float[] { -DIST , -DIST , +0.00f};
|
|
238 |
CENTERS[37] = new float[] { -DIST , +DIST , +0.00f};
|
|
239 |
CENTERS[38] = new float[] { +0.00f, +DIST , -DIST };
|
|
240 |
CENTERS[39] = new float[] { +DIST , +0.00f, -DIST };
|
|
241 |
CENTERS[40] = new float[] { +0.00f, -DIST , -DIST };
|
|
242 |
CENTERS[41] = new float[] { -DIST , +0.00f, -DIST };
|
|
243 | 243 |
|
244 | 244 |
return CENTERS; |
245 | 245 |
} |
src/main/java/org/distorted/objects/TwistySkewb.java | ||
---|---|---|
213 | 213 |
|
214 | 214 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
215 | 215 |
|
216 |
Static3D[] getCubitPositions(int numLayers)
|
|
216 |
float[][] getCubitPositions(int numLayers)
|
|
217 | 217 |
{ |
218 | 218 |
final float DIST_CORNER = (numLayers-1)*0.50f; |
219 | 219 |
final float DIST_EDGE = (numLayers-1)*0.50f; |
... | ... | |
223 | 223 |
final int numEdges = getNumEdges(numLayers); |
224 | 224 |
final int numCenters = 6*getNumCentersPerFace(numLayers); |
225 | 225 |
|
226 |
final Static3D[] CENTERS = new Static3D[numCorners+numEdges+numCenters];
|
|
226 |
final float[][] CENTERS = new float[numCorners+numEdges+numCenters][];
|
|
227 | 227 |
|
228 | 228 |
/// CORNERS ////////////////////////////////////////////// |
229 | 229 |
|
230 |
CENTERS[0] = new Static3D( DIST_CORNER, DIST_CORNER, DIST_CORNER );
|
|
231 |
CENTERS[1] = new Static3D( DIST_CORNER, DIST_CORNER,-DIST_CORNER );
|
|
232 |
CENTERS[2] = new Static3D( DIST_CORNER,-DIST_CORNER, DIST_CORNER );
|
|
233 |
CENTERS[3] = new Static3D( DIST_CORNER,-DIST_CORNER,-DIST_CORNER );
|
|
234 |
CENTERS[4] = new Static3D(-DIST_CORNER, DIST_CORNER, DIST_CORNER );
|
|
235 |
CENTERS[5] = new Static3D(-DIST_CORNER, DIST_CORNER,-DIST_CORNER );
|
|
236 |
CENTERS[6] = new Static3D(-DIST_CORNER,-DIST_CORNER, DIST_CORNER );
|
|
237 |
CENTERS[7] = new Static3D(-DIST_CORNER,-DIST_CORNER,-DIST_CORNER );
|
|
230 |
CENTERS[0] = new float[] { DIST_CORNER, DIST_CORNER, DIST_CORNER };
|
|
231 |
CENTERS[1] = new float[] { DIST_CORNER, DIST_CORNER,-DIST_CORNER };
|
|
232 |
CENTERS[2] = new float[] { DIST_CORNER,-DIST_CORNER, DIST_CORNER };
|
|
233 |
CENTERS[3] = new float[] { DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
|
|
234 |
CENTERS[4] = new float[] {-DIST_CORNER, DIST_CORNER, DIST_CORNER };
|
|
235 |
CENTERS[5] = new float[] {-DIST_CORNER, DIST_CORNER,-DIST_CORNER };
|
|
236 |
CENTERS[6] = new float[] {-DIST_CORNER,-DIST_CORNER, DIST_CORNER };
|
|
237 |
CENTERS[7] = new float[] {-DIST_CORNER,-DIST_CORNER,-DIST_CORNER };
|
|
238 | 238 |
|
239 | 239 |
/// EDGES /////////////////////////////////////////////// |
240 | 240 |
|
... | ... | |
262 | 262 |
|
263 | 263 |
for (int j=0; j<numLayers-2; j++, c+=1.0f, index++) |
264 | 264 |
{ |
265 |
CENTERS[index] = new Static3D( edges[0]==0 ? c : edges[0] ,
|
|
265 |
CENTERS[index] = new float[] { edges[0]==0 ? c : edges[0] ,
|
|
266 | 266 |
edges[1]==0 ? c : edges[1] , |
267 |
edges[2]==0 ? c : edges[2] );
|
|
267 |
edges[2]==0 ? c : edges[2] };
|
|
268 | 268 |
} |
269 | 269 |
} |
270 | 270 |
|
... | ... | |
307 | 307 |
else if( centers[2]==X ) cen2 = x; |
308 | 308 |
else cen2 = centers[2]; |
309 | 309 |
|
310 |
CENTERS[index] = new Static3D(cen0,cen1,cen2);
|
|
310 |
CENTERS[index] = new float[] {cen0,cen1,cen2};
|
|
311 | 311 |
} |
312 | 312 |
} |
313 | 313 |
|
... | ... | |
331 | 331 |
else if( centers[2]==X ) cen2 = x; |
332 | 332 |
else cen2 = centers[2]; |
333 | 333 |
|
334 |
CENTERS[index] = new Static3D(cen0,cen1,cen2);
|
|
334 |
CENTERS[index] = new float[] {cen0,cen1,cen2};
|
|
335 | 335 |
} |
336 | 336 |
} |
337 | 337 |
} |
Also available in: Unified diff
Change the Cubit center from a Static3D to a float[].
The point: now we can have more than one center, and bandaged objects need more than one, because in this way they are going to fill up their RotationRow bitmaps.