1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.ximtec.igesture.util;
28
29 import java.awt.Color;
30 import java.awt.Graphics;
31 import java.awt.geom.Rectangle2D;
32 import java.awt.image.BufferedImage;
33 import java.util.ArrayList;
34 import java.util.HashMap;
35 import java.util.HashSet;
36 import java.util.List;
37 import java.util.Set;
38
39 import org.sigtec.ink.Note;
40 import org.sigtec.ink.Point;
41 import org.sigtec.ink.Trace;
42 import org.sigtec.ink.TraceTool;
43 import org.ximtec.igesture.core.Gesture;
44 import org.ximtec.igesture.core.GestureClass;
45 import org.ximtec.igesture.core.GestureSample;
46 import org.ximtec.igesture.core.GestureSet;
47 import org.ximtec.igesture.core.SampleDescriptor;
48 import org.ximtec.igesture.core.TestSet;
49 import org.ximtec.igesture.core.composite.Constraint;
50 import org.ximtec.igesture.util.additions3d.RecordedGesture3D;
51
52
53
54
55
56
57
58
59
60 public class GestureTool {
61
62 private static final String COMBINED_SET = "CombinedGestureSet";
63 private static final String DEFAULT_NAME = "Name";
64
65
66 public static double scaleTraceTo(org.sigtec.ink.Trace trace,
67 double maxWidth, double maxHeight) {
68 Rectangle2D bounds = trace.getBounds2D();
69 double width = bounds.getWidth();
70 double height = bounds.getHeight();
71 double scaleX = maxWidth / width;
72 double scaleY = maxHeight / height;
73 return (scaleX < scaleY) ? scaleX : scaleY;
74 }
75
76
77
78
79
80
81
82
83 public static GestureSet combine(List<GestureSet> sets) {
84 final Set<GestureClass> gestureClasses = new HashSet<GestureClass>();
85
86 for (GestureSet set : sets) {
87 gestureClasses.addAll(set.getGestureClasses());
88 }
89
90 return new GestureSet(new ArrayList<GestureClass>(gestureClasses));
91 }
92
93
94
95
96
97
98
99
100
101
102
103 public static Trace getCharacteristicTrace(Trace trace, double minAngle,
104 double minDistance) {
105 Trace inputTrace = TraceTool.filterTrace(trace, minDistance);
106 Trace resultTrace = new Trace();
107
108 if (inputTrace.size() > 2) {
109 Point p1 = trace.get(0);
110 Point p2 = trace.get(2);
111 Point p3 = null;
112 double angle1 = getAngle(p1, p2);
113 double angle2 = 0;
114
115 resultTrace.add(p1);
116
117 for (int i = 2; i < inputTrace.size(); i++) {
118 p3 = inputTrace.get(i);
119 angle2 = getAngle(p2, p3);
120
121 if (Math.abs(angle1 - angle2) > minAngle) {
122
123 resultTrace.add(p2);
124
125 p1 = p2;
126 p2 = p3;
127 }
128 else {
129
130
131
132 p2 = p3;
133 }
134
135 angle1 = getAngle(p1, p2);
136 }
137
138
139 resultTrace.add(inputTrace.get(inputTrace.size() - 1));
140 }
141 else {
142 resultTrace = inputTrace;
143 }
144
145 return resultTrace;
146 }
147
148
149
150
151
152
153
154
155
156 public static Note getCharacteristicNote(Note note, double minAngle,
157 double minDistance) {
158 Note result = new Note();
159
160 for (Trace trace : note.getTraces()) {
161 result.add(getCharacteristicTrace(trace, minAngle, minDistance));
162 }
163
164 return result;
165 }
166
167
168
169
170
171
172
173
174
175 public static double getAngle(Point p1, Point p2) {
176 double r = p1.distance(p2);
177 double x = p2.getX() - p1.getX();
178 double alpha = Math.toDegrees(Math.acos(x / r));
179
180 if (p2.getY() - p1.getY() < 0) {
181 alpha = 360 - alpha;
182 }
183
184 return alpha;
185 }
186
187
188
189
190
191
192
193
194
195 public static BufferedImage createNoteImage(Note n, int width, int height) {
196 Note note = (Note)n.clone();
197 BufferedImage bufferedImage = new BufferedImage(width, height,
198 BufferedImage.TYPE_INT_ARGB);
199 Graphics graphic = bufferedImage.getGraphics();
200 graphic.setColor(Color.BLACK);
201 note.scaleTo(width - 10, height - 10);
202 note.moveTo(5, 5);
203 note.paint(graphic);
204 return bufferedImage;
205 }
206
207
208
209
210
211
212
213
214
215 public static BufferedImage createRecordedGesture3DImage(RecordedGesture3D gesture, int width, int height) {
216 RecordedGesture3D record = (RecordedGesture3D)gesture.clone();
217 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
218 Graphics graphic = bufferedImage.getGraphics();
219 RecordedGesture3DTool.paintGesture(record,graphic, width, height, false);
220 return bufferedImage;
221 }
222
223
224
225
226
227
228
229
230
231
232 public static BufferedImage createCompositeImage(Constraint constraint, int width, int height) {
233 String name = constraint.getClass().getSimpleName();
234 int index = name.indexOf("Constraint");
235 BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
236 Graphics graphic = bufferedImage.getGraphics();
237 graphic.setColor(Color.BLACK);
238 graphic.drawString(name.substring(0, index), 5, height/2-5);
239 graphic.drawString("Constraint",5,height/2+5);
240 return bufferedImage;
241 }
242
243
244
245
246
247
248 public static GestureSet combineSampleData(List<GestureSet> sets) {
249 HashMap<String, GestureClass> samples = new HashMap<String, GestureClass>();
250 GestureSet result = new GestureSet(COMBINED_SET);
251
252 for (GestureSet set : sets) {
253
254 for (GestureClass gestureClass : set.getGestureClasses()) {
255
256 if (samples.containsKey(gestureClass.getName())) {
257 GestureClass target = samples.get(gestureClass.getName());
258
259 for (Gesture<Note> sample : gestureClass.getDescriptor(
260 SampleDescriptor.class).getSamples()) {
261 target.getDescriptor(SampleDescriptor.class).addSample(sample);
262 }
263
264 }
265 else {
266 samples.put(gestureClass.getName(), gestureClass);
267 result.addGestureClass(gestureClass);
268 }
269
270 }
271
272 }
273 return result;
274 }
275
276
277
278
279
280
281
282 public static TestSet createTestSet(GestureSet set) {
283 TestSet testSet = new TestSet(DEFAULT_NAME);
284
285 for (GestureClass gestureClass : set.getGestureClasses()) {
286
287 for (Gesture<?> sample : gestureClass.getDescriptor(
288 SampleDescriptor.class).getSamples()) {
289 testSet.add(new GestureSample(sample.getSource(),gestureClass.getName(), (Note)sample
290 .getGesture()));
291 }
292
293 }
294
295 return testSet;
296 }
297
298
299
300
301
302
303
304 public static TestSet createNoise(GestureSet set) {
305 TestSet testSet = new TestSet(DEFAULT_NAME);
306
307 for (GestureClass gestureClass : set.getGestureClasses()) {
308
309 for (Gesture<?> sample : gestureClass.getDescriptor(
310 SampleDescriptor.class).getSamples()) {
311 testSet.add(new GestureSample(sample.getSource(),TestSet.NOISE, (Note)sample.getGesture()));
312 }
313
314 }
315
316 return testSet;
317 }
318
319
320
321
322
323
324
325 public static TestSet combineTestSet(TestSet[] testSets) {
326 TestSet result = new TestSet(DEFAULT_NAME);
327
328 for (TestSet set : testSets) {
329 result.addTestClasses(set.getTestClasses());
330 }
331
332 return result;
333 }
334
335
336 public static void hasSampleEnoughPoints(GestureSet set, int min){
337 for(GestureClass gestureClass:set.getGestureClasses()){
338 hasSampleEnoughPoints(gestureClass, min);
339 }
340 }
341
342 public static void hasSampleEnoughPoints(GestureClass gestureClass, int min){
343 if(gestureClass.hasDescriptor(SampleDescriptor.class)){
344 SampleDescriptor descriptor = gestureClass.getDescriptor(SampleDescriptor.class);
345 for(Gesture<?> sample:descriptor.getSamples()){
346 if(((Note)sample.getGesture()).getPoints().size() <= min){
347 System.out.println(gestureClass.getName()+" : "+ ((Note)sample.getGesture()).getPoints().size());
348 }
349 }
350 }
351 }
352
353 }