middleware/Tracking/Gestures/WaveDetector.cs
changeset 37 37ebedd84755
parent 27 6c08d4d7219e
--- a/middleware/Tracking/Gestures/WaveDetector.cs	Wed May 30 10:22:46 2012 +0200
+++ b/middleware/Tracking/Gestures/WaveDetector.cs	Thu Jun 21 16:52:56 2012 +0200
@@ -61,25 +61,32 @@
             //De la position p1 à pn, on suit l'algorithme.
             for (int i = localHistory.Count - indexesToCheck + 1; i < localHistory.Count; i++)
             {
-                /*if (localHistory[i][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.ElbowRight].Position.Y + refDistance)
-                    debug.onR0(true);
+                /*if (localHistory[i][(int)JointType.HandRight].Position.Y + refDistance / 2 > localHistory[i][(int)JointType.ElbowRight].Position.Y)
+                    debug.onR0(false);
                 else
-                    debug.onR0(false);
-                if (localHistory[i][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.HipCenter].Position.Y)
+                    debug.onR0(true);
+                if (localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HipCenter].Position.Y)
+                    debug.onR1(false);
+                else
                     debug.onR1(true);
+                if (localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.WristRight].Position.Y)
+                    debug.onR2(false);
                 else
-                    debug.onR1(false);
-                if (localHistory[i][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.WristRight].Position.Y + refDistance / 4)
                     debug.onR2(true);
+                if (Math.Abs(localHistory[i][(int)JointType.HandRight].Position.Z - localHistory[i][(int)JointType.Head].Position.Z) > 0.20)
+                    debug.onR3(false);
                 else
-                    debug.onR2(false);*/
+                    debug.onR3(true);*/
                 //Si la position Y de la main droite est plus haute que le coude + la distance de référence
                 //OU si la position Y de la main droite est plus basse que la hanche
-                //OU si la position Y de la main droite est plus haute que le poignet + le quart de la distance de référence.
+                //OU si la position Y de la main droite est plus haute que le poignet + le quart de la distance de référence
+                //OU si la distance Y de la main à la tete est plus grande que la distance de référence
+                //OU si la distance Z de la main à la tete est plus grande que 20 cm.
                 //Alors la main en question ne fait pas de Wave.
-                if (localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.ElbowRight].Position.Y + refDistance ||
+                if (localHistory[i][(int)JointType.HandRight].Position.Y + refDistance / 2 > localHistory[i][(int)JointType.ElbowRight].Position.Y ||
                     localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HipCenter].Position.Y ||
-                localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.WristRight].Position.Y + refDistance / 4)
+                    localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.WristRight].Position.Y ||
+                    Math.Abs(localHistory[i][(int)JointType.HandRight].Position.Z - localHistory[i][(int)JointType.Head].Position.Z) > 0.20)
                     return false;
 
                 //On vérifie si la main à bougé vers la droite.
@@ -88,7 +95,7 @@
                     movedRight = true;
 
                 //Si la main a bougé vers la droite, on regarde si elle est retournée à sa position initiale.
-                if (movedRight && localHistory[i][(int)JointType.HandRight].Position.X <= startPosX)
+                if (movedRight && Math.Abs(localHistory[i][(int)JointType.HandRight].Position.X - startPosX) <= refDistance)
                 {
                     history.Clear();
                     return true;