EyeTracking has the same result of the original Java version.
[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 public class DeviationScanner {\r
26 \r
27   private EyePosition eyePositions[];\r
28 \r
29   // LEFT_UP(+1, -1), UP(0, -1), RIGHT_UP(-1, -1), LEFT(+1, 0), NONE(0, 0),\r
30   // RIGHT(-1, 0), LEFT_DOWN(\r
31   // +1, +1), DOWN(0, +1), RIGHT_DOWN(-1, +1);\r
32 \r
33   private static final Deviation LEFT_UP = new Deviation("LEFT_UP", +1, -1);\r
34   private static final Deviation UP = new Deviation("UP", 0, -1);\r
35   private static final Deviation RIGHT_UP = new Deviation("RIGHT_UP", -1, -1);\r
36   private static final Deviation LEFT = new Deviation("LEFT", +1, 0);\r
37   private static final Deviation NONE = new Deviation("NONE", 0, 0);\r
38   private static final Deviation RIGHT = new Deviation("RIGHT", -1, 0);\r
39   private static final Deviation LEFT_DOWN = new Deviation("LEFT_DOWN", +1, +1);\r
40   private static final Deviation DOWN = new Deviation("DOWN", 0, +1);\r
41   private static final Deviation RIGHT_DOWN = new Deviation("RIGHT_DOWN", -1, +1);\r
42 \r
43   private int size;\r
44 \r
45   public DeviationScanner() {\r
46     eyePositions = new EyePosition[3];\r
47     size = 0;\r
48   }\r
49 \r
50   public void addEyePosition(EyePosition eyePosition) {\r
51 \r
52     for (int i = 1; i < eyePositions.length; i++) {\r
53       eyePositions[i - 1] = eyePositions[i];\r
54     }\r
55     eyePositions[eyePositions.length - 1] = eyePosition;\r
56 \r
57     if (size < eyePositions.length) {\r
58       size++;\r
59     }\r
60   }\r
61 \r
62   public int getEyePositionsSize() {\r
63     return size;\r
64   }\r
65 \r
66   public Deviation scanForDeviation(Rectangle2D faceRect) {\r
67     Deviation deviation = NONE;\r
68     if (getEyePositionsSize() >= 3) {\r
69       double deviationX = 0;\r
70       double deviationY = 0;\r
71 \r
72       EyePosition lastEyePosition = null;\r
73       for (int i = 0; i < 3; ++i) {\r
74         EyePosition eyePosition = this.eyePositions[i];\r
75         if (lastEyePosition != null) {\r
76           deviationX += (eyePosition.getX() - lastEyePosition.getX());\r
77           deviationY += (eyePosition.getY() - lastEyePosition.getY());\r
78         }\r
79         lastEyePosition = eyePosition;\r
80       }\r
81 \r
82       final double deviationPercentX = 0.04;\r
83       final double deviationPercentY = 0.04;\r
84 \r
85       deviationX /= faceRect.getWidth();\r
86       deviationY /= faceRect.getWidth();\r
87 \r
88       int deviationAbsoluteX = 0;\r
89       int deviationAbsoluteY = 0;\r
90       if (deviationX > deviationPercentX)\r
91         deviationAbsoluteX = 1;\r
92       if (deviationX < -deviationPercentX)\r
93         deviationAbsoluteX = -1;\r
94       if (deviationY > deviationPercentY)\r
95         deviationAbsoluteY = 1;\r
96       if (deviationY < -deviationPercentY)\r
97         deviationAbsoluteY = -1;\r
98 \r
99       deviation = getDirectionFor(deviationAbsoluteX, deviationAbsoluteY);\r
100 \r
101       if (deviation != NONE) {\r
102         eyePositions = new EyePosition[3];\r
103         size = 0;\r
104       }\r
105       // System.out.println(String.format("%.2f%% | %.2f%% => %d and %d >>> %s",\r
106       // deviationX*100, deviationY*100, deviationAbsoluteX, deviationAbsoluteY,\r
107       // deviation.toString()));\r
108 \r
109     }\r
110 \r
111     return deviation;\r
112   }\r
113 \r
114   public static Deviation getDirectionFor(int directionX, int directionY) {\r
115 \r
116     if (LEFT_UP.concurs(directionX, directionY)) {\r
117       return LEFT_UP;\r
118     } else if (UP.concurs(directionX, directionY)) {\r
119       return UP;\r
120     } else if (RIGHT_UP.concurs(directionX, directionY)) {\r
121       return RIGHT_UP;\r
122     } else if (LEFT.concurs(directionX, directionY)) {\r
123       return LEFT;\r
124     } else if (NONE.concurs(directionX, directionY)) {\r
125       return NONE;\r
126     } else if (RIGHT.concurs(directionX, directionY)) {\r
127       return RIGHT;\r
128     } else if (LEFT_DOWN.concurs(directionX, directionY)) {\r
129       return LEFT_DOWN;\r
130     } else if (DOWN.concurs(directionX, directionY)) {\r
131       return DOWN;\r
132     } else if (RIGHT_DOWN.concurs(directionX, directionY)) {\r
133       return RIGHT_DOWN;\r
134     }\r
135     return null;\r
136   }\r
137 \r
138   public void clear() {\r
139     System.out.println("CLEAR");\r
140     eyePositions = new EyePosition[3];\r
141     size = 0;\r
142   }\r
143 \r
144 }\r