Project

General

Profile

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

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

1
///////////////////////////////////////////////////////////////////////////////////////////////////
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
import static org.distorted.objects.TwistyKilominx.C1;
24
import static org.distorted.objects.TwistyKilominx.C2;
25
import static org.distorted.objects.TwistyKilominx.LEN;
26
import static org.distorted.objects.FactoryCubit.SIN54;
27
import static org.distorted.objects.FactoryCubit.COS54;
28
import static org.distorted.objects.TwistyObject.SQ5;
29
import static org.distorted.objects.FactoryCubit.COS18;
30
import static org.distorted.objects.TwistyMegaminx.MEGA_D;
31

    
32
///////////////////////////////////////////////////////////////////////////////////////////////////
33

    
34
class MovementMinx extends Movement
35
{
36
  static final float DIST3D = (float)Math.sqrt(0.625f+0.275f*SQ5)/3;
37
  static final float DIST2D = (0.5f*SIN54/COS54)/3;
38

    
39
  static final Static3D[] FACE_AXIS = new Static3D[]
40
         {
41
           new Static3D( C2/LEN, C1/LEN, 0      ),
42
           new Static3D( C2/LEN,-C1/LEN, 0      ),
43
           new Static3D(-C2/LEN, C1/LEN, 0      ),
44
           new Static3D(-C2/LEN,-C1/LEN, 0      ),
45
           new Static3D( 0     , C2/LEN, C1/LEN ),
46
           new Static3D( 0     , C2/LEN,-C1/LEN ),
47
           new Static3D( 0     ,-C2/LEN, C1/LEN ),
48
           new Static3D( 0     ,-C2/LEN,-C1/LEN ),
49
           new Static3D( C1/LEN, 0     , C2/LEN ),
50
           new Static3D( C1/LEN, 0     ,-C2/LEN ),
51
           new Static3D(-C1/LEN, 0     , C2/LEN ),
52
           new Static3D(-C1/LEN, 0     ,-C2/LEN )
53
         };
54

    
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56

    
57
  MovementMinx()
58
    {
59
    super(TwistyMinx.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
60
    }
61

    
62
///////////////////////////////////////////////////////////////////////////////////////////////////
63

    
64
  int computeRowFromOffset(int face, int size, float offset)
65
    {
66
    if( size==3 )
67
      {
68
      return offset<DIST2D ? 0:2;
69
      }
70
    if( size==5 )
71
      {
72
      // TODO
73

    
74
      float LEN = (0.5f-MEGA_D)*COS18/3;
75

    
76
      android.util.Log.e("mega", "offset = "+offset+" len="+LEN+" dist2D="+DIST2D);
77

    
78
      if( offset<LEN/2 ) return 0;
79
      if( offset<LEN   ) return 1;
80
      }
81

    
82
    return 0;
83
    }
84

    
85
///////////////////////////////////////////////////////////////////////////////////////////////////
86

    
87
  public float returnRotationFactor(int size, int row)
88
    {
89
    return 1.0f;
90
    }
91

    
92
///////////////////////////////////////////////////////////////////////////////////////////////////
93
// return angle (in radians) that the line connecting the center C of the pentagonal face and the
94
// first vertex of the pentagon makes with a vertical line coming upwards from the center C.
95

    
96
  private float returnAngle(int face)
97
    {
98
    switch(face)
99
      {
100
      case  0:
101
      case  2:
102
      case  6:
103
      case  7: return 0.0f;
104
      case  1:
105
      case  3:
106
      case  4:
107
      case  5: return (float)(36*Math.PI/180);
108
      case  9:
109
      case 10: return (float)(54*Math.PI/180);
110
      case  8:
111
      case 11: return (float)(18*Math.PI/180);
112
      }
113

    
114
    return 0.0f;
115
    }
116

    
117
///////////////////////////////////////////////////////////////////////////////////////////////////
118
// The pair (distance,angle) defines a point P in R^2 in polar coordinate system. Let V be the vector
119
// from the center of the coordinate system to P.
120
// Let P' be the point defined by polar (distance,angle+PI/2). Let Lh be the half-line starting at
121
// P' and going in the direction of V.
122
// Return true iff point 'point' lies on the left of Lh, i.e. when we rotate (using the center of
123
// the coordinate system as the center of rotation) 'point' and Lh in such a way that Lh points
124
// directly upwards, is 'point' on the left or the right of it?
125

    
126
  private boolean isOnTheLeft(float[] point, float distance, float angle)
127
    {
128
    float sin = (float)Math.sin(angle);
129
    float cos = (float)Math.cos(angle);
130

    
131
    float vx = point[0] + sin*distance;
132
    float vy = point[1] - cos*distance;
133

    
134
    return vx*sin < vy*cos;
135
    }
136

    
137
///////////////////////////////////////////////////////////////////////////////////////////////////
138
// Return 1,2,3,4,5 - the vertex of the pentagon to which point 'point' is the closest, if the
139
// 'point' is inside the pentagon - or 0 otherwise.
140
// The 'first' vertex is the one we meet the first when we rotate clockwise starting from 12:00.
141
// This vertex makes angle 'returnAngle()' with the line coming out upwards from the center of the
142
// pentagon.
143
// Distance from the center to a vertex of the pentagon = 1/(6*COS54)
144

    
145
  private int returnPartOfThePentagon(float[] point, int face)
146
    {
147
    float angle = returnAngle(face);
148
    float A = (float)(Math.PI/5);
149

    
150
    for(int i=0; i<5; i++)
151
      {
152
      if( isOnTheLeft(point, DIST2D, (9-2*i)*A-angle) ) return 0;
153
      }
154

    
155
    if( isOnTheLeft(point, 0, 2.5f*A-angle) )
156
      {
157
      if( isOnTheLeft(point, 0, 3.5f*A-angle) )
158
        {
159
        return isOnTheLeft(point, 0, 5.5f*A-angle) ? 4 : 5;
160
        }
161
      else return 1;
162
      }
163
    else
164
      {
165
      if( isOnTheLeft(point, 0, 4.5f*A-angle) )
166
        {
167
        return 3;
168
        }
169
      else
170
        {
171
        return isOnTheLeft(point, 0, 6.5f*A-angle) ? 2 : 1;
172
        }
173
      }
174
    }
175

    
176
///////////////////////////////////////////////////////////////////////////////////////////////////
177

    
178
  boolean isInsideFace(int face, float[] p)
179
    {
180
    return returnPartOfThePentagon(p,face) > 0;
181
    }
182

    
183
///////////////////////////////////////////////////////////////////////////////////////////////////
184

    
185
  void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)
186
    {
187
    int part = returnPartOfThePentagon(touchPoint,face);
188

    
189
    if( part>0 )
190
      {
191
      enabled[0] = 2;
192

    
193
      switch(face)
194
        {
195
        case  0:  switch(part)
196
                    {
197
                    case 1: enabled[1]=2; enabled[2]=3; break;
198
                    case 2: enabled[1]=3; enabled[2]=5; break;
199
                    case 3: enabled[1]=5; enabled[2]=1; break;
200
                    case 4: enabled[1]=1; enabled[2]=4; break;
201
                    case 5: enabled[1]=4; enabled[2]=2; break;
202
                    }
203
                  break;
204

    
205
        case  1:  switch(part)
206
                    {
207
                    case 1: enabled[1]=0; enabled[2]=5; break;
208
                    case 2: enabled[1]=5; enabled[2]=2; break;
209
                    case 3: enabled[1]=2; enabled[2]=3; break;
210
                    case 4: enabled[1]=3; enabled[2]=4; break;
211
                    case 5: enabled[1]=4; enabled[2]=0; break;
212
                    }
213
                  break;
214

    
215
        case  2:  switch(part)
216
                    {
217
                    case 1: enabled[1]=3; enabled[2]=2; break;
218
                    case 2: enabled[1]=2; enabled[2]=5; break;
219
                    case 3: enabled[1]=5; enabled[2]=0; break;
220
                    case 4: enabled[1]=0; enabled[2]=4; break;
221
                    case 5: enabled[1]=4; enabled[2]=3; break;
222
                    }
223
                  break;
224

    
225
        case  3:  switch(part)
226
                    {
227
                    case 1: enabled[1]=1; enabled[2]=5; break;
228
                    case 2: enabled[1]=5; enabled[2]=3; break;
229
                    case 3: enabled[1]=3; enabled[2]=2; break;
230
                    case 4: enabled[1]=2; enabled[2]=4; break;
231
                    case 5: enabled[1]=4; enabled[2]=1; break;
232
                    }
233
                  break;
234

    
235
        case  4:  switch(part)
236
                    {
237
                    case 1: enabled[1]=3; enabled[2]=0; break;
238
                    case 2: enabled[1]=0; enabled[2]=4; break;
239
                    case 3: enabled[1]=4; enabled[2]=5; break;
240
                    case 4: enabled[1]=5; enabled[2]=1; break;
241
                    case 5: enabled[1]=1; enabled[2]=3; break;
242
                    }
243
                  break;
244

    
245
        case  5:  switch(part)
246
                    {
247
                    case 1: enabled[1]=2; enabled[2]=1; break;
248
                    case 2: enabled[1]=1; enabled[2]=4; break;
249
                    case 3: enabled[1]=4; enabled[2]=5; break;
250
                    case 4: enabled[1]=5; enabled[2]=0; break;
251
                    case 5: enabled[1]=0; enabled[2]=2; break;
252
                    }
253
                  break;
254

    
255
        case  6:  switch(part)
256
                    {
257
                    case 1: enabled[1]=5; enabled[2]=4; break;
258
                    case 2: enabled[1]=4; enabled[2]=1; break;
259
                    case 3: enabled[1]=1; enabled[2]=2; break;
260
                    case 4: enabled[1]=2; enabled[2]=0; break;
261
                    case 5: enabled[1]=0; enabled[2]=5; break;
262
                    }
263
                  break;
264

    
265
        case  7:  switch(part)
266
                    {
267
                    case 1: enabled[1]=5; enabled[2]=4; break;
268
                    case 2: enabled[1]=4; enabled[2]=0; break;
269
                    case 3: enabled[1]=0; enabled[2]=3; break;
270
                    case 4: enabled[1]=3; enabled[2]=1; break;
271
                    case 5: enabled[1]=1; enabled[2]=5; break;
272
                    }
273
                  break;
274

    
275
        case  8: switch(part)
276
                    {
277
                    case 1: enabled[1]=2; enabled[2]=0; break;
278
                    case 2: enabled[1]=0; enabled[2]=1; break;
279
                    case 3: enabled[1]=1; enabled[2]=3; break;
280
                    case 4: enabled[1]=3; enabled[2]=5; break;
281
                    case 5: enabled[1]=5; enabled[2]=2; break;
282
                    }
283
                  break;
284

    
285
        case  9:  switch(part)
286
                    {
287
                    case 1: enabled[1]=3; enabled[2]=4; break;
288
                    case 2: enabled[1]=4; enabled[2]=2; break;
289
                    case 3: enabled[1]=2; enabled[2]=1; break;
290
                    case 4: enabled[1]=1; enabled[2]=0; break;
291
                    case 5: enabled[1]=0; enabled[2]=3; break;
292
                    }
293
                  break;
294

    
295
        case 10:  switch(part)
296
                    {
297
                    case 1: enabled[1]=2; enabled[2]=4; break;
298
                    case 2: enabled[1]=4; enabled[2]=3; break;
299
                    case 3: enabled[1]=3; enabled[2]=0; break;
300
                    case 4: enabled[1]=0; enabled[2]=1; break;
301
                    case 5: enabled[1]=1; enabled[2]=2; break;
302
                    }
303
                  break;
304

    
305
        case 11:  switch(part)
306
                    {
307
                    case 1: enabled[1]=3; enabled[2]=1; break;
308
                    case 2: enabled[1]=1; enabled[2]=0; break;
309
                    case 3: enabled[1]=0; enabled[2]=2; break;
310
                    case 4: enabled[1]=2; enabled[2]=5; break;
311
                    case 5: enabled[1]=5; enabled[2]=3; break;
312
                    }
313
                  break;
314
        }
315
      }
316
    else
317
      {
318
      enabled[0] = 0;
319
      }
320
    }
321
}
(10-10/30)