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