2 * Copyright 2009 (c) Florian Frankenberger (darkblue.de)
\r
4 * This file is part of LEA.
\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
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
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
21 * No description given.
\r
23 * @author Florian Frankenberger
\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
30 private EyePosition eyePositions[];
\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
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
49 public DeviationScanner() {
\r
50 eyePositions = new EyePosition[3];
\r
54 @LATTICE("THIS<C,C<IN,THISLOC=THIS")
\r
55 public void addEyePosition(@LOC("IN") EyePosition eyePosition) {
\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
61 // eyePositions[eyePositions.length - 1] = eyePosition;
\r
63 SSJAVA.append(eyePositions, eyePosition);
\r
65 if (size < eyePositions.length) {
\r
68 size= eyePositions.length;
\r
73 @RETURNLOC("THIS,DeviationScanner.DEV")
\r
74 public int getEyePositionsSize() {
\r
78 // @LATTICE("OUT<DEV,DEV<C,C<THIS,THIS<IN,C*,DEV*,OUT*,THISLOC=THIS,RETURNLOC=OUT")
\r
79 @LATTICE("THIS<IN,THISLOC=THIS")
\r
80 @RETURNLOC("THIS,DeviationScanner.DEV")
\r
81 public int scanForDeviation(@LOC("IN") Rectangle2D faceRect) {
\r
82 @LOC("THIS,DeviationScanner.DEV") int deviation = NONE;
\r
83 if (getEyePositionsSize() >= 3) {
\r
84 @LOC("THIS,DeviationScanner.DEV") double deviationX = 0;
\r
85 @LOC("THIS,DeviationScanner.DEV") double deviationY = 0;
\r
87 @LOC("THIS,DeviationScanner.DEV") int lastIdx = -1;
\r
88 for (@LOC("THIS,DeviationScanner.DEV") int i = 0; i < 3; ++i) {
\r
89 if (lastIdx != -1) {
\r
90 deviationX += (eyePositions[i].getX() - eyePositions[lastIdx].getX());
\r
91 deviationY += (eyePositions[i].getY() - eyePositions[lastIdx].getY());
\r
96 @LOC("THIS,DeviationScanner.DEV") final double deviationPercentX = 0.04;
\r
97 @LOC("THIS,DeviationScanner.DEV") final double deviationPercentY = 0.04;
\r
99 deviationX /= faceRect.getWidth();
\r
100 deviationY /= faceRect.getWidth();
\r
102 @LOC("THIS,DeviationScanner.DEV") int deviationAbsoluteX = 0;
\r
103 @LOC("THIS,DeviationScanner.DEV") int deviationAbsoluteY = 0;
\r
104 if (deviationX > deviationPercentX)
\r
105 deviationAbsoluteX = 1;
\r
106 if (deviationX < -deviationPercentX)
\r
107 deviationAbsoluteX = -1;
\r
108 if (deviationY > deviationPercentY)
\r
109 deviationAbsoluteY = 1;
\r
110 if (deviationY < -deviationPercentY)
\r
111 deviationAbsoluteY = -1;
\r
113 deviation = getDirectionFor(deviationAbsoluteX, deviationAbsoluteY);
\r
115 if (deviation != NONE) {
\r
116 eyePositions = new EyePosition[3];
\r
119 // System.out.println(String.format("%.2f%% | %.2f%% => %d and %d >>> %s",
\r
120 // deviationX*100, deviationY*100, deviationAbsoluteX, deviationAbsoluteY,
\r
121 // deviation.toString()));
\r
128 @LATTICE("OUT<IN,OUT<THIS,THISLOC=THIS,RETURNLOC=OUT")
\r
129 public int getDirectionFor(@LOC("IN") int directionX, @LOC("IN") int directionY) {
\r
131 if (directionX == +1 && directionY == -1) {
\r
133 } else if (directionX == 0 && directionY == -1) {
\r
135 } else if (directionX == -1 && directionY == -1) {
\r
137 } else if (directionX == +1 && directionY == 0) {
\r
139 } else if (directionX == 0 && directionY == 0) {
\r
141 } else if (directionX == -1 && directionY == 0) {
\r
143 } else if (directionX == +1 && directionY == +1) {
\r
145 } else if (directionX == 0 && directionY == +1) {
\r
147 } else if (directionX == -1 && directionY == +1) {
\r
154 public void clear() {
\r
155 System.out.println("CLEAR");
\r
156 eyePositions = new EyePosition[3];
\r
160 public String toStringDeviation(@LOC("IN") int dev) {
\r
161 if (dev == LEFT_UP) {
\r
163 } else if (dev == UP) {
\r
165 } else if (dev == RIGHT_UP) {
\r
167 } else if (dev == LEFT) {
\r
169 } else if (dev == NONE) {
\r
171 } else if (dev == RIGHT) {
\r
173 } else if (dev == LEFT_DOWN) {
\r
174 return "LEFT_DOWN";
\r
175 } else if (dev == DOWN) {
\r
177 } else if (dev == RIGHT_DOWN) {
\r
178 return "RIGHT_DOWN";
\r