052c7f4bdc25a45dd654612530a1f786be97078f
[IRC.git] / Robust / src / Benchmarks / SSJava / EyeTracking / DeviationScanner.java
1 /*\r
2  * Copyright 2009 (c) Florian Frankenberger (darkblue.de)\r
3  * \r
4  * This file is part of LEA.\r
5  * \r
6  * LEA is free software: you can redistribute it and/or modify it under the\r
7  * terms of the GNU Lesser General Public License as published by the Free\r
8  * Software Foundation, either version 3 of the License, or (at your option) any\r
9  * later version.\r
10  * \r
11  * LEA is distributed in the hope that it will be useful, but WITHOUT ANY\r
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR\r
13  * A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more\r
14  * details.\r
15  * \r
16  * You should have received a copy of the GNU Lesser General Public License\r
17  * along with LEA. If not, see <http://www.gnu.org/licenses/>.\r
18  */\r
19 \r
20 /**\r
21  * No description given.\r
22  * \r
23  * @author Florian Frankenberger\r
24  */\r
25 @LATTICE("DEV<C,C<SIZE,SIZE*,C*,DEV*")\r
26 @METHODDEFAULT("OUT<THIS,THIS<IN,THISLOC=THIS,RETURNLOC=OUT")\r
27 public class DeviationScanner {\r
28 \r
29   @LOC("DEV")\r
30   private EyePosition eyePositions[];\r
31 \r
32   // LEFT_UP(+1, -1), UP(0, -1), RIGHT_UP(-1, -1), LEFT(+1, 0), NONE(0, 0),\r
33   // RIGHT(-1, 0), LEFT_DOWN(\r
34   // +1, +1), DOWN(0, +1), RIGHT_DOWN(-1, +1);\r
35 \r
36   public static final int LEFT_UP = 0;\r
37   public static final int UP = 1;\r
38   public static final int RIGHT_UP = 2;\r
39   public static final int LEFT = 3;\r
40   public static final int NONE = 4;\r
41   public static final int RIGHT = 5;\r
42   public static final int LEFT_DOWN = 6;\r
43   public static final int DOWN = 7;\r
44   public static final int RIGHT_DOWN = 8;\r
45 \r
46   @LOC("DEV")\r
47   private int size;\r
48 \r
49   public DeviationScanner() {\r
50     eyePositions = new EyePosition[3];\r
51     size = 0;\r
52   }\r
53 \r
54   @LATTICE("THIS<C,C<IN,THISLOC=THIS")\r
55   public void addEyePosition(@LOC("IN") EyePosition eyePosition) {\r
56 \r
57     // for (@LOC("THIS,DeviationScanner.C") int i = 1; i < 3; i++) {\r
58     // eyePositions[i - 1] = eyePositions[i];\r
59     // eyePositions[i] = null;\r
60     // }\r
61     // eyePositions[eyePositions.length - 1] = eyePosition;\r
62 \r
63     SSJAVA.append(eyePositions, eyePosition);\r
64 \r
65     if (size < eyePositions.length) {\r
66       size++;\r
67     }\r
68 \r
69   }\r
70 \r
71   @RETURNLOC("THIS,DeviationScanner.DEV")\r
72   public int getEyePositionsSize() {\r
73     return size;\r
74   }\r
75 \r
76   // @LATTICE("OUT<DEV,DEV<C,C<THIS,THIS<IN,C*,DEV*,OUT*,THISLOC=THIS,RETURNLOC=OUT")\r
77   @LATTICE("THIS<IN,THISLOC=THIS")\r
78   @RETURNLOC("THIS,DeviationScanner.DEV")\r
79   public int scanForDeviation(@LOC("IN") Rectangle2D faceRect) {\r
80     @LOC("THIS,DeviationScanner.DEV") int deviation = NONE;\r
81     if (getEyePositionsSize() >= 3) {\r
82       @LOC("THIS,DeviationScanner.DEV") double deviationX = 0;\r
83       @LOC("THIS,DeviationScanner.DEV") double deviationY = 0;\r
84 \r
85       @LOC("THIS,DeviationScanner.DEV") int lastIdx = -1;\r
86       for (@LOC("THIS,DeviationScanner.DEV") int i = 0; i < 3; ++i) {\r
87         if (lastIdx != -1) {\r
88           deviationX += (eyePositions[i].getX() - eyePositions[lastIdx].getX());\r
89           deviationY += (eyePositions[i].getY() - eyePositions[lastIdx].getY());\r
90         }\r
91         lastIdx = i;\r
92       }\r
93 \r
94       @LOC("THIS,DeviationScanner.DEV") final double deviationPercentX = 0.04;\r
95       @LOC("THIS,DeviationScanner.DEV") final double deviationPercentY = 0.04;\r
96 \r
97       deviationX /= faceRect.getWidth();\r
98       deviationY /= faceRect.getWidth();\r
99 \r
100       @LOC("THIS,DeviationScanner.DEV") int deviationAbsoluteX = 0;\r
101       @LOC("THIS,DeviationScanner.DEV") int deviationAbsoluteY = 0;\r
102       if (deviationX > deviationPercentX)\r
103         deviationAbsoluteX = 1;\r
104       if (deviationX < -deviationPercentX)\r
105         deviationAbsoluteX = -1;\r
106       if (deviationY > deviationPercentY)\r
107         deviationAbsoluteY = 1;\r
108       if (deviationY < -deviationPercentY)\r
109         deviationAbsoluteY = -1;\r
110 \r
111       deviation = getDirectionFor(deviationAbsoluteX, deviationAbsoluteY);\r
112 \r
113       if (deviation != NONE) {\r
114         eyePositions = new EyePosition[3];\r
115         size = 0;\r
116       }\r
117       // System.out.println(String.format("%.2f%% | %.2f%% => %d and %d >>> %s",\r
118       // deviationX*100, deviationY*100, deviationAbsoluteX, deviationAbsoluteY,\r
119       // deviation.toString()));\r
120 \r
121     }\r
122 \r
123     return deviation;\r
124   }\r
125 \r
126   @LATTICE("OUT<IN,OUT<THIS,THISLOC=THIS,RETURNLOC=OUT")\r
127   public int getDirectionFor(@LOC("IN") int directionX, @LOC("IN") int directionY) {\r
128 \r
129     if (directionX == +1 && directionY == -1) {\r
130       return LEFT_UP;\r
131     } else if (directionX == 0 && directionY == -1) {\r
132       return UP;\r
133     } else if (directionX == -1 && directionY == -1) {\r
134       return RIGHT_UP;\r
135     } else if (directionX == +1 && directionY == 0) {\r
136       return LEFT;\r
137     } else if (directionX == 0 && directionY == 0) {\r
138       return NONE;\r
139     } else if (directionX == -1 && directionY == 0) {\r
140       return RIGHT;\r
141     } else if (directionX == +1 && directionY == +1) {\r
142       return LEFT_DOWN;\r
143     } else if (directionX == 0 && directionY == +1) {\r
144       return DOWN;\r
145     } else if (directionX == -1 && directionY == +1) {\r
146       return RIGHT_DOWN;\r
147     }\r
148 \r
149     return -1;\r
150   }\r
151 \r
152   public void clear() {\r
153     System.out.println("CLEAR");\r
154     eyePositions = new EyePosition[3];\r
155     size = 0;\r
156   }\r
157 \r
158   public String toStringDeviation(@LOC("IN") int dev) {\r
159     if (dev == LEFT_UP) {\r
160       return "LEFT_UP";\r
161     } else if (dev == UP) {\r
162       return "UP";\r
163     } else if (dev == RIGHT_UP) {\r
164       return "RIGHT_UP";\r
165     } else if (dev == LEFT) {\r
166       return "LEFT";\r
167     } else if (dev == NONE) {\r
168       return "NONE";\r
169     } else if (dev == RIGHT) {\r
170       return "RIGHT";\r
171     } else if (dev == LEFT_DOWN) {\r
172       return "LEFT_DOWN";\r
173     } else if (dev == DOWN) {\r
174       return "DOWN";\r
175     } else if (dev == RIGHT_DOWN) {\r
176       return "RIGHT_DOWN";\r
177     }\r
178     return "ERROR";\r
179   }\r
180 \r
181 }\r