Project

General

Profile

Download (12.2 KB) Statistics
| Branch: | Tag: | Revision:

magiccube / src / main / java / org / distorted / objects / MovementMinx.java @ eaf87d1d

1 bbc6da6c Leszek Koltunski
///////////////////////////////////////////////////////////////////////////////////////////////////
2
// Copyright 2020 Leszek Koltunski                                                               //
3
//                                                                                               //
4
// This file is part of Magic Cube.                                                              //
5
//                                                                                               //
6
// Magic Cube is free software: you can redistribute it and/or modify                            //
7
// it under the terms of the GNU General Public License as published by                          //
8
// the Free Software Foundation, either version 2 of the License, or                             //
9
// (at your option) any later version.                                                           //
10
//                                                                                               //
11
// Magic Cube is distributed in the hope that it will be useful,                                 //
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of                                //
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                                 //
14
// GNU General Public License for more details.                                                  //
15
//                                                                                               //
16
// You should have received a copy of the GNU General Public License                             //
17
// along with Magic Cube.  If not, see <http://www.gnu.org/licenses/>.                           //
18
///////////////////////////////////////////////////////////////////////////////////////////////////
19
20
package org.distorted.objects;
21
22
import org.distorted.library.type.Static3D;
23 fa806818 Leszek Koltunski
import static org.distorted.objects.TwistyKilominx.C1;
24
import static org.distorted.objects.TwistyKilominx.C2;
25
import static org.distorted.objects.TwistyKilominx.LEN;
26 12313693 Leszek Koltunski
import static org.distorted.objects.FactoryCubit.SIN54;
27
import static org.distorted.objects.FactoryCubit.COS54;
28
import static org.distorted.objects.TwistyObject.SQ5;
29 bbc6da6c Leszek Koltunski
30
///////////////////////////////////////////////////////////////////////////////////////////////////
31
32 a64e07d0 Leszek Koltunski
class MovementMinx extends Movement
33 bbc6da6c Leszek Koltunski
{
34 12313693 Leszek Koltunski
  static final float DIST3D = (float)Math.sqrt(0.625f+0.275f*SQ5)/3;
35
  static final float DIST2D = (0.5f*SIN54/COS54)/3;
36 bbc6da6c Leszek Koltunski
37
  static final Static3D[] FACE_AXIS = new Static3D[]
38
         {
39 12313693 Leszek Koltunski
           new Static3D( C2/LEN, C1/LEN, 0      ),
40
           new Static3D( C2/LEN,-C1/LEN, 0      ),
41
           new Static3D(-C2/LEN, C1/LEN, 0      ),
42
           new Static3D(-C2/LEN,-C1/LEN, 0      ),
43
           new Static3D( 0     , C2/LEN, C1/LEN ),
44
           new Static3D( 0     , C2/LEN,-C1/LEN ),
45
           new Static3D( 0     ,-C2/LEN, C1/LEN ),
46
           new Static3D( 0     ,-C2/LEN,-C1/LEN ),
47
           new Static3D( C1/LEN, 0     , C2/LEN ),
48
           new Static3D( C1/LEN, 0     ,-C2/LEN ),
49
           new Static3D(-C1/LEN, 0     , C2/LEN ),
50
           new Static3D(-C1/LEN, 0     ,-C2/LEN )
51 bbc6da6c Leszek Koltunski
         };
52
53
///////////////////////////////////////////////////////////////////////////////////////////////////
54
55 a64e07d0 Leszek Koltunski
  MovementMinx()
56 bbc6da6c Leszek Koltunski
    {
57 ede1b68c Leszek Koltunski
    super(TwistyMinx.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
58 bbc6da6c Leszek Koltunski
    }
59
60
///////////////////////////////////////////////////////////////////////////////////////////////////
61
62
  int computeRowFromOffset(int face, int size, float offset)
63
    {
64 ede1b68c Leszek Koltunski
    if( size==3 )
65
      {
66
      return offset<DIST2D ? 0:2;
67
      }
68
    if( size==5 )
69
      {
70 30bc2d91 Leszek Koltunski
      float quot = offset / DIST2D;
71 ede1b68c Leszek Koltunski
72 30bc2d91 Leszek Koltunski
      if( quot>0.00f && quot<=0.34f ) return 0;
73
      if( quot>0.34f && quot<=1.00f ) return 1;
74
      if( quot>1.00f && quot<=1.66f ) return 3;
75
      if( quot>1.66f && quot<=2.00f ) return 4;
76 ede1b68c Leszek Koltunski
      }
77
78
    return 0;
79 bbc6da6c Leszek Koltunski
    }
80
81
///////////////////////////////////////////////////////////////////////////////////////////////////
82
83
  public float returnRotationFactor(int size, int row)
84
    {
85
    return 1.0f;
86
    }
87
88
///////////////////////////////////////////////////////////////////////////////////////////////////
89 451c6c36 Leszek Koltunski
// return angle (in radians) that the line connecting the center C of the pentagonal face and the
90
// first vertex of the pentagon makes with a vertical line coming upwards from the center C.
91
92
  private float returnAngle(int face)
93
    {
94
    switch(face)
95
      {
96
      case  0:
97
      case  2:
98
      case  6:
99
      case  7: return 0.0f;
100
      case  1:
101
      case  3:
102
      case  4:
103
      case  5: return (float)(36*Math.PI/180);
104
      case  9:
105
      case 10: return (float)(54*Math.PI/180);
106
      case  8:
107
      case 11: return (float)(18*Math.PI/180);
108
      }
109
110
    return 0.0f;
111
    }
112
113
///////////////////////////////////////////////////////////////////////////////////////////////////
114
// The pair (distance,angle) defines a point P in R^2 in polar coordinate system. Let V be the vector
115
// from the center of the coordinate system to P.
116
// Let P' be the point defined by polar (distance,angle+PI/2). Let Lh be the half-line starting at
117
// P' and going in the direction of V.
118
// Return true iff point 'point' lies on the left of Lh, i.e. when we rotate (using the center of
119
// the coordinate system as the center of rotation) 'point' and Lh in such a way that Lh points
120
// directly upwards, is 'point' on the left or the right of it?
121
122
  private boolean isOnTheLeft(float[] point, float distance, float angle)
123
    {
124
    float sin = (float)Math.sin(angle);
125
    float cos = (float)Math.cos(angle);
126
127
    float vx = point[0] + sin*distance;
128
    float vy = point[1] - cos*distance;
129
130
    return vx*sin < vy*cos;
131
    }
132
133
///////////////////////////////////////////////////////////////////////////////////////////////////
134
// Return 1,2,3,4,5 - the vertex of the pentagon to which point 'point' is the closest, if the
135
// 'point' is inside the pentagon - or 0 otherwise.
136
// The 'first' vertex is the one we meet the first when we rotate clockwise starting from 12:00.
137
// This vertex makes angle 'returnAngle()' with the line coming out upwards from the center of the
138
// pentagon.
139
// Distance from the center to a vertex of the pentagon = 1/(6*COS54)
140
141
  private int returnPartOfThePentagon(float[] point, int face)
142
    {
143
    float angle = returnAngle(face);
144
    float A = (float)(Math.PI/5);
145
146
    for(int i=0; i<5; i++)
147
      {
148
      if( isOnTheLeft(point, DIST2D, (9-2*i)*A-angle) ) return 0;
149
      }
150
151
    if( isOnTheLeft(point, 0, 2.5f*A-angle) )
152
      {
153
      if( isOnTheLeft(point, 0, 3.5f*A-angle) )
154
        {
155
        return isOnTheLeft(point, 0, 5.5f*A-angle) ? 4 : 5;
156
        }
157
      else return 1;
158
      }
159
    else
160
      {
161
      if( isOnTheLeft(point, 0, 4.5f*A-angle) )
162
        {
163
        return 3;
164
        }
165
      else
166
        {
167
        return isOnTheLeft(point, 0, 6.5f*A-angle) ? 2 : 1;
168
        }
169
      }
170
    }
171
172
///////////////////////////////////////////////////////////////////////////////////////////////////
173 bbc6da6c Leszek Koltunski
174
  boolean isInsideFace(int face, float[] p)
175
    {
176 451c6c36 Leszek Koltunski
    return returnPartOfThePentagon(p,face) > 0;
177 bbc6da6c Leszek Koltunski
    }
178
179
///////////////////////////////////////////////////////////////////////////////////////////////////
180
181
  void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
182
    {
183 451c6c36 Leszek Koltunski
    int part = returnPartOfThePentagon(touchPoint,face);
184 bbc6da6c Leszek Koltunski
185 451c6c36 Leszek Koltunski
    if( part>0 )
186 bbc6da6c Leszek Koltunski
      {
187 451c6c36 Leszek Koltunski
      enabled[0] = 2;
188
189
      switch(face)
190
        {
191
        case  0:  switch(part)
192
                    {
193
                    case 1: enabled[1]=2; enabled[2]=3; break;
194
                    case 2: enabled[1]=3; enabled[2]=5; break;
195
                    case 3: enabled[1]=5; enabled[2]=1; break;
196
                    case 4: enabled[1]=1; enabled[2]=4; break;
197
                    case 5: enabled[1]=4; enabled[2]=2; break;
198
                    }
199
                  break;
200
201
        case  1:  switch(part)
202
                    {
203
                    case 1: enabled[1]=0; enabled[2]=5; break;
204
                    case 2: enabled[1]=5; enabled[2]=2; break;
205
                    case 3: enabled[1]=2; enabled[2]=3; break;
206
                    case 4: enabled[1]=3; enabled[2]=4; break;
207
                    case 5: enabled[1]=4; enabled[2]=0; break;
208
                    }
209
                  break;
210
211
        case  2:  switch(part)
212
                    {
213
                    case 1: enabled[1]=3; enabled[2]=2; break;
214
                    case 2: enabled[1]=2; enabled[2]=5; break;
215
                    case 3: enabled[1]=5; enabled[2]=0; break;
216
                    case 4: enabled[1]=0; enabled[2]=4; break;
217
                    case 5: enabled[1]=4; enabled[2]=3; break;
218
                    }
219
                  break;
220
221
        case  3:  switch(part)
222
                    {
223
                    case 1: enabled[1]=1; enabled[2]=5; break;
224
                    case 2: enabled[1]=5; enabled[2]=3; break;
225
                    case 3: enabled[1]=3; enabled[2]=2; break;
226
                    case 4: enabled[1]=2; enabled[2]=4; break;
227
                    case 5: enabled[1]=4; enabled[2]=1; break;
228
                    }
229
                  break;
230
231
        case  4:  switch(part)
232
                    {
233
                    case 1: enabled[1]=3; enabled[2]=0; break;
234
                    case 2: enabled[1]=0; enabled[2]=4; break;
235
                    case 3: enabled[1]=4; enabled[2]=5; break;
236
                    case 4: enabled[1]=5; enabled[2]=1; break;
237
                    case 5: enabled[1]=1; enabled[2]=3; break;
238
                    }
239
                  break;
240
241
        case  5:  switch(part)
242
                    {
243
                    case 1: enabled[1]=2; enabled[2]=1; break;
244
                    case 2: enabled[1]=1; enabled[2]=4; break;
245
                    case 3: enabled[1]=4; enabled[2]=5; break;
246
                    case 4: enabled[1]=5; enabled[2]=0; break;
247
                    case 5: enabled[1]=0; enabled[2]=2; break;
248
                    }
249
                  break;
250
251
        case  6:  switch(part)
252
                    {
253
                    case 1: enabled[1]=5; enabled[2]=4; break;
254
                    case 2: enabled[1]=4; enabled[2]=1; break;
255
                    case 3: enabled[1]=1; enabled[2]=2; break;
256
                    case 4: enabled[1]=2; enabled[2]=0; break;
257
                    case 5: enabled[1]=0; enabled[2]=5; break;
258
                    }
259
                  break;
260
261
        case  7:  switch(part)
262
                    {
263
                    case 1: enabled[1]=5; enabled[2]=4; break;
264
                    case 2: enabled[1]=4; enabled[2]=0; break;
265
                    case 3: enabled[1]=0; enabled[2]=3; break;
266
                    case 4: enabled[1]=3; enabled[2]=1; break;
267
                    case 5: enabled[1]=1; enabled[2]=5; break;
268
                    }
269
                  break;
270
271
        case  8: switch(part)
272
                    {
273
                    case 1: enabled[1]=2; enabled[2]=0; break;
274
                    case 2: enabled[1]=0; enabled[2]=1; break;
275
                    case 3: enabled[1]=1; enabled[2]=3; break;
276
                    case 4: enabled[1]=3; enabled[2]=5; break;
277
                    case 5: enabled[1]=5; enabled[2]=2; break;
278
                    }
279
                  break;
280
281
        case  9:  switch(part)
282
                    {
283
                    case 1: enabled[1]=3; enabled[2]=4; break;
284
                    case 2: enabled[1]=4; enabled[2]=2; break;
285
                    case 3: enabled[1]=2; enabled[2]=1; break;
286
                    case 4: enabled[1]=1; enabled[2]=0; break;
287
                    case 5: enabled[1]=0; enabled[2]=3; break;
288
                    }
289
                  break;
290
291
        case 10:  switch(part)
292
                    {
293
                    case 1: enabled[1]=2; enabled[2]=4; break;
294
                    case 2: enabled[1]=4; enabled[2]=3; break;
295
                    case 3: enabled[1]=3; enabled[2]=0; break;
296
                    case 4: enabled[1]=0; enabled[2]=1; break;
297
                    case 5: enabled[1]=1; enabled[2]=2; break;
298
                    }
299
                  break;
300
301
        case 11:  switch(part)
302
                    {
303
                    case 1: enabled[1]=3; enabled[2]=1; break;
304
                    case 2: enabled[1]=1; enabled[2]=0; break;
305
                    case 3: enabled[1]=0; enabled[2]=2; break;
306
                    case 4: enabled[1]=2; enabled[2]=5; break;
307
                    case 5: enabled[1]=5; enabled[2]=3; break;
308
                    }
309
                  break;
310
        }
311
      }
312
    else
313
      {
314
      enabled[0] = 0;
315 bbc6da6c Leszek Koltunski
      }
316
    }
317
}