Revision aaeef328
Added by Leszek Koltunski about 1 year ago
src/main/java/org/distorted/objectlib/touchcontrol/TouchControlTetrahedron.java | ||
---|---|---|
37 | 37 |
super(object,D3D,FACE_AXIS); |
38 | 38 |
} |
39 | 39 |
|
40 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
41 |
|
|
42 |
private boolean isFaceInverted(int face) |
|
43 |
{ |
|
44 |
return face>1; |
|
45 |
} |
|
46 |
|
|
47 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
48 |
|
|
49 |
private int partEdge(float[] point, int face) |
|
50 |
{ |
|
51 |
float y = (isFaceInverted(face) ? point[1] : -point[1]); |
|
52 |
float x = point[0]; |
|
53 |
|
|
54 |
boolean e0 = x>0; |
|
55 |
boolean e1 = y>( SQ3/3)*x; |
|
56 |
boolean e2 = y>(-SQ3/3)*x; |
|
57 |
|
|
58 |
if( e1 && e2 ) return 0; |
|
59 |
if( !e1 && e0 ) return 1; |
|
60 |
return 2; |
|
61 |
} |
|
62 |
|
|
63 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
64 |
|
|
65 |
private int partCorner(float[] point, int face) |
|
66 |
{ |
|
67 |
float y = (isFaceInverted(face) ? point[1] : -point[1]); |
|
68 |
float x = point[0]; |
|
69 |
|
|
70 |
boolean c0 = x>0; |
|
71 |
boolean c1 = y>( SQ3/3)*x; |
|
72 |
boolean c2 = y>(-SQ3/3)*x; |
|
73 |
|
|
74 |
if( c0 && c2 ) return 0; |
|
75 |
if( !c1 &&!c2 ) return 1; |
|
76 |
return 2; |
|
77 |
} |
|
78 |
|
|
40 | 79 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
41 | 80 |
// corner edge |
42 | 81 |
// | \ 0 / |
... | ... | |
46 | 85 |
// |
47 | 86 |
// COIN: pieces inside the coin just like in EDGE; outside +=3. |
48 | 87 |
|
49 |
int returnPart(int type, int face, float[] touchPoint)
|
|
88 |
int returnPart(int type, int face, float[] point)
|
|
50 | 89 |
{ |
51 | 90 |
switch(type) |
52 | 91 |
{ |
53 | 92 |
case TYPE_NOT_SPLIT : return 0; |
54 |
|
|
55 |
case TYPE_SPLIT_EDGE : float y1 = (face > 1 ? touchPoint[1] : -touchPoint[1]); |
|
56 |
float x1 = touchPoint[0]; |
|
57 |
|
|
58 |
boolean e0 = x1>0; |
|
59 |
boolean e1 = y1>( SQ3/3)*x1; |
|
60 |
boolean e2 = y1>(-SQ3/3)*x1; |
|
61 |
|
|
62 |
if( e1 && e2 ) return 0; |
|
63 |
if( !e1 && e0 ) return 1; |
|
64 |
if( !e0 &&!e2 ) return 2; |
|
65 |
return 0; |
|
66 |
|
|
67 |
case TYPE_SPLIT_CORNER: float y2 = (face > 1 ? touchPoint[1] : -touchPoint[1]); |
|
68 |
float x2 = touchPoint[0]; |
|
69 |
|
|
70 |
boolean c0 = x2>0; |
|
71 |
boolean c1 = y2>( SQ3/3)*x2; |
|
72 |
boolean c2 = y2>(-SQ3/3)*x2; |
|
73 |
|
|
74 |
if( c0 && c2 ) return 0; |
|
75 |
if( !c1 &&!c2 ) return 1; |
|
76 |
if( !c0 && c1 ) return 2; |
|
77 |
return 0; |
|
78 |
case TYPE_SPLIT_EDGE_COIN: float y3 = (face > 1 ? touchPoint[1] : -touchPoint[1]); |
|
79 |
float x3 = touchPoint[0]; |
|
80 |
|
|
81 |
boolean s0 = x3>0; |
|
82 |
boolean s1 = y3>( SQ3/3)*x3; |
|
83 |
boolean s2 = y3>(-SQ3/3)*x3; |
|
84 |
|
|
85 |
int add = (x3*x3+y3*y3<DIST2D*DIST2D ? 0:3 ); |
|
86 |
|
|
87 |
if( s1 && s2 ) return add; |
|
88 |
if( !s1 && s0 ) return add+1; |
|
89 |
if( !s0 &&!s2 ) return add+2; |
|
90 |
return 0; |
|
93 |
case TYPE_SPLIT_EDGE : return partEdge(point,face); |
|
94 |
case TYPE_SPLIT_CORNER : return partCorner(point,face); |
|
95 |
case TYPE_SPLIT_EDGE_COIN: float y = point[1]; |
|
96 |
float x = point[0]; |
|
97 |
return partEdge(point,face) + (x*x+y*y < DIST2D*DIST2D ? 0:3 ); |
|
91 | 98 |
} |
92 | 99 |
|
93 | 100 |
return 0; |
... | ... | |
104 | 111 |
|
105 | 112 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
106 | 113 |
|
107 |
boolean isInsideFace(int face, float[] p) |
|
114 |
boolean isInsideFace(int face, float[] point)
|
|
108 | 115 |
{ |
109 |
float y = (face > 1 ? p[1] : -p[1]);
|
|
110 |
float x = p[0]; |
|
116 |
float y = (isFaceInverted(face) ? point[1] : -point[1]);
|
|
117 |
float x = point[0];
|
|
111 | 118 |
return (y >= -DIST2D) && (y <= DIST2D*(2-6*x)) && (y <= DIST2D*(2+6*x)); |
112 | 119 |
} |
113 | 120 |
} |
Also available in: Unified diff
Support split type 'EDGE_COIN' in case of every shape.