Project

General

Profile

« Previous | Next » 

Revision be7c9190

Added by Leszek Koltunski over 2 years ago

Abstract out some methods from the Movement classes. only two remain now: rowFromOffset and enabledAxis.

View differences:

src/main/java/org/distorted/objects/MovementMinx.java
19 19

  
20 20
package org.distorted.objects;
21 21

  
22
import org.distorted.library.type.Static3D;
23
import static org.distorted.objects.TwistyMinx.C2;
24
import static org.distorted.objects.TwistyMinx.LEN;
25
import static org.distorted.objects.TwistyMinx.SIN54;
26
import static org.distorted.objects.TwistyMinx.COS54;
27
import static org.distorted.objects.TwistyObject.SQ5;
28

  
29 22
///////////////////////////////////////////////////////////////////////////////////////////////////
30 23

  
31
class MovementMinx extends Movement
24
class MovementMinx extends Movement12
32 25
{
33
  static final float DIST3D = (float)Math.sqrt(0.625f+0.275f*SQ5);
34
  static final float DIST2D = (SIN54/COS54)/2;
35

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

  
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53

  
54 26
  MovementMinx()
55 27
    {
56
    super(TwistyMinx.ROT_AXIS, FACE_AXIS, DIST3D, DIST2D);
28
    super(TwistyMinx.ROT_AXIS);
57 29
    }
58 30

  
59 31
///////////////////////////////////////////////////////////////////////////////////////////////////
......
77 49
    return 0;
78 50
    }
79 51

  
80
///////////////////////////////////////////////////////////////////////////////////////////////////
81

  
82
  public float returnRotationFactor(int numLayers, int row)
83
    {
84
    return 1.0f;
85
    }
86

  
87
///////////////////////////////////////////////////////////////////////////////////////////////////
88
// return angle (in radians) that the line connecting the center C of the pentagonal face and the
89
// first vertex of the pentagon makes with a vertical line coming upwards from the center C.
90

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

  
109
    return 0.0f;
110
    }
111

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

  
121
  private boolean isOnTheLeft(float[] point, float distance, float angle)
122
    {
123
    float sin = (float)Math.sin(angle);
124
    float cos = (float)Math.cos(angle);
125

  
126
    float vx = point[0] + sin*distance;
127
    float vy = point[1] - cos*distance;
128

  
129
    return vx*sin < vy*cos;
130
    }
131

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

  
140
  private int returnPartOfThePentagon(float[] point, int face)
141
    {
142
    float angle = returnAngle(face);
143
    float A = (float)(Math.PI/5);
144

  
145
    for(int i=0; i<5; i++)
146
      {
147
      if( isOnTheLeft(point, DIST2D, (9-2*i)*A-angle) ) return 0;
148
      }
149

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

  
171
///////////////////////////////////////////////////////////////////////////////////////////////////
172

  
173
  boolean isInsideFace(int face, float[] p)
174
    {
175
    return returnPartOfThePentagon(p,face) > 0;
176
    }
177

  
178 52
///////////////////////////////////////////////////////////////////////////////////////////////////
179 53

  
180 54
  void computeEnabledAxis(int face, float[] touchPoint, int[] enabled)

Also available in: Unified diff