6da3f7e1d4a121f4309335eb6bcaec8c36c88c94
[IRC.git] / Robust / src / Benchmarks / SSJava / EyeTrackingInfer / 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 \r
26 public class DeviationScanner {\r
27 \r
28   private EyePosition eyePositions[];\r
29 \r
30   // LEFT_UP(+1, -1), UP(0, -1), RIGHT_UP(-1, -1), LEFT(+1, 0), NONE(0, 0),\r
31   // RIGHT(-1, 0), LEFT_DOWN(\r
32   // +1, +1), DOWN(0, +1), RIGHT_DOWN(-1, +1);\r
33 \r
34   public static final int LEFT_UP = 0;\r
35   public static final int UP = 1;\r
36   public static final int RIGHT_UP = 2;\r
37   public static final int LEFT = 3;\r
38   public static final int NONE = 4;\r
39   public static final int RIGHT = 5;\r
40   public static final int LEFT_DOWN = 6;\r
41   public static final int DOWN = 7;\r
42   public static final int RIGHT_DOWN = 8;\r
43 \r
44   public DeviationScanner() {\r
45     eyePositions = new EyePosition[3];\r
46   }\r
47 \r
48   public void addEyePosition(EyePosition eyePosition) {\r
49 \r
50     // for ( int i = 1; i < 3; i++) {\r
51     // eyePositions[i - 1] = eyePositions[i];\r
52     // eyePositions[i] = null;\r
53     // }\r
54     // eyePositions[eyePositions.length - 1] = eyePosition;\r
55 \r
56     SSJAVA.append(eyePositions, eyePosition);\r
57 \r
58   }\r
59 \r
60   //\r
61 \r
62   public int scanForDeviation(Rectangle2D faceRect) {\r
63 \r
64     int deviation = NONE;\r
65 \r
66     for (int i = 0; i < 3; i++) {\r
67       if (eyePositions[i] == null) {\r
68         return deviation;\r
69       }\r
70     }\r
71 \r
72     double deviationX = 0;\r
73     double deviationY = 0;\r
74 \r
75     int lastIdx = -1;\r
76     for (int i = 0; i < 3; ++i) {\r
77       if (lastIdx != -1) {\r
78         deviationX += (eyePositions[i].getX() - eyePositions[lastIdx].getX());\r
79         deviationY += (eyePositions[i].getY() - eyePositions[lastIdx].getY());\r
80       }\r
81       lastIdx = i;\r
82     }\r
83 \r
84     final double deviationPercentX = 0.04;\r
85     final double deviationPercentY = 0.04;\r
86 \r
87     deviationX /= faceRect.getWidth();\r
88     deviationY /= faceRect.getWidth();\r
89 \r
90     int deviationAbsoluteX = 0;\r
91     int deviationAbsoluteY = 0;\r
92     if (deviationX > deviationPercentX)\r
93       deviationAbsoluteX = 1;\r
94     if (deviationX < -deviationPercentX)\r
95       deviationAbsoluteX = -1;\r
96     if (deviationY > deviationPercentY)\r
97       deviationAbsoluteY = 1;\r
98     if (deviationY < -deviationPercentY)\r
99       deviationAbsoluteY = -1;\r
100 \r
101     deviation = getDirectionFor(deviationAbsoluteX, deviationAbsoluteY);\r
102 \r
103     if (deviation != NONE) {\r
104       eyePositions = new EyePosition[3];\r
105     }\r
106     // System.out.println(String.format("%.2f%% | %.2f%% => %d and %d >>> %s",\r
107     // deviationX*100, deviationY*100, deviationAbsoluteX, deviationAbsoluteY,\r
108     // deviation.toString()));\r
109 \r
110     return deviation;\r
111   }\r
112 \r
113   public int getDirectionFor(int directionX, int directionY) {\r
114 \r
115     if (directionX == +1 && directionY == -1) {\r
116       return LEFT_UP;\r
117     } else if (directionX == 0 && directionY == -1) {\r
118       return UP;\r
119     } else if (directionX == -1 && directionY == -1) {\r
120       return RIGHT_UP;\r
121     } else if (directionX == +1 && directionY == 0) {\r
122       return LEFT;\r
123     } else if (directionX == 0 && directionY == 0) {\r
124       return NONE;\r
125     } else if (directionX == -1 && directionY == 0) {\r
126       return RIGHT;\r
127     } else if (directionX == +1 && directionY == +1) {\r
128       return LEFT_DOWN;\r
129     } else if (directionX == 0 && directionY == +1) {\r
130       return DOWN;\r
131     } else if (directionX == -1 && directionY == +1) {\r
132       return RIGHT_DOWN;\r
133     }\r
134 \r
135     return -1;\r
136   }\r
137 \r
138   public void clear() {\r
139     System.out.println("CLEAR");\r
140     eyePositions = new EyePosition[3];\r
141   }\r
142 \r
143   public String toStringDeviation(int dev) {\r
144     if (dev == LEFT_UP) {\r
145       return "LEFT_UP";\r
146     } else if (dev == UP) {\r
147       return "UP";\r
148     } else if (dev == RIGHT_UP) {\r
149       return "RIGHT_UP";\r
150     } else if (dev == LEFT) {\r
151       return "LEFT";\r
152     } else if (dev == NONE) {\r
153       return "NONE";\r
154     } else if (dev == RIGHT) {\r
155       return "RIGHT";\r
156     } else if (dev == LEFT_DOWN) {\r
157       return "LEFT_DOWN";\r
158     } else if (dev == DOWN) {\r
159       return "DOWN";\r
160     } else if (dev == RIGHT_DOWN) {\r
161       return "RIGHT_DOWN";\r
162     }\r
163     return "ERROR";\r
164   }\r
165 \r
166 }\r