middleware/src/Tracking/Gestures/PushDetector.cs
author bastiena
Tue, 20 Mar 2012 18:00:55 +0100
changeset 7 8a21bec5d45f
parent 5 d40f84d77db4
child 8 e4e7db2435f8
permissions -rw-r--r--
Middleware : No proximity bugs anymore. The skeleton disappear if a tracked person is too close or not tracked anymore. Processing : There are no laggs anymore when an user stay too long moving his hands and drawing tons of ellipses. (TUIO Cursors are not taken by their vectors, only the last position of the cursors are caught to be drawn).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     1
/*
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     2
 * Projet : TraKERS
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     3
 * Module : MIDDLEWARE
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     4
 * Sous-Module : Tracking/Gestures
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     5
 * Classe : PushDetector
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     6
 * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     7
 * Auteur : alexandre.bastien@iri.centrepompidou.fr
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     8
 * 
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
     9
 * Fonctionnalités : Permet de détecter si l'utilisateur a effectué un Push, en se basant sur
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    10
 * des règles appliquées à la positions des noeuds dans le temps.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    11
 */
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    12
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    13
using System;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    14
using System.Collections.Generic;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    15
using System.Linq;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    16
using System.Text;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    17
using Microsoft.Kinect;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    18
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    19
namespace Trakers.Tracking.Gestures
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    20
{
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    21
    public class PushDetector : GestureDetector
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    22
    {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    23
        public enum Direction { PUSH, PULL };
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    24
        public enum Hand { LEFT, RIGHT, BOTH, NONE };
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    25
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    26
        Debug.DebugWindow debug;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    27
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    28
        public PushDetector(Debug.DebugWindow _d) : base()
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    29
        {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    30
            debug = _d;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    31
            gesturePeriod = (float)0.3;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    32
            indexesPerSecond = 30;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    33
            indexesToCheck = (int)(gesturePeriod * indexesPerSecond);
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    34
        }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    35
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    36
        /*
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    37
         * Lit les noeuds de l'historique du squelette afin de détecter un Push.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    38
         * Règles :
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    39
         * Se fait avec une main (gauche ou droite).
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    40
         * Chaque nouvelle position de la main doit être plus profonde que la précédente.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    41
         * Chaque nouvelle position de la main ne doit pas dévier trop de l'axe perpendiculaire au plan (X, Y).
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    42
         * Le geste doit mesurer en profondeur une certaine distance.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    43
         */
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    44
        public Hand CheckForPush()
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    45
        {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    46
            //Crée un historique de squelette local, puisque l'historique est mis à jour toutes les ~1/30 s.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    47
            List<List<Joint>> localHistory = new List<List<Joint>>(history);
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    48
            
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    49
            //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    50
            if (localHistory.Count < indexesToCheck + 1)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    51
                return Hand.NONE;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    52
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    53
            //La distance de référence est ici la distance entre le milieu du dos et le milieu des épaules.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    54
            refDistance = Math.Abs(localHistory[0][(int)JointType.Spine].Position.Y - localHistory[0][(int)JointType.ShoulderCenter].Position.Y);
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    55
            //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    56
            SkeletonPoint startPointLeft = localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandLeft].Position;
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    57
            SkeletonPoint startPointRight = localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandRight].Position;
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    58
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    59
            //Booléens indiquant si le mouvement serait valide pour la main gauche ou droite.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    60
            bool leftHandOK = true, rightHandOK = true;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    61
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    62
            //De la position p1 à pn, on suit l'algorithme.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    63
            for (int i = localHistory.Count - indexesToCheck + 1; i < localHistory.Count; i++)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    64
            {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    65
                //Si la position Y de la main est plus haute que la tête
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    66
                //OU si la position Y de la main est plus basse que la hanche
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    67
                //OU si la nouvelle position Z de la main est moins profonde que la précédente
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    68
                //OU si la nouvelle position X de la main est plus éloignée de la distance N par rapport à la première position X
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    69
                //OU si la nouvelle position Y de la main est plus éloignée de la distance N par rapport à la première position Y
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    70
                //Alors la main en question ne fait pas de push.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    71
                if (localHistory[i][(int)JointType.HandLeft].Position.Y < localHistory[i][(int)JointType.Head].Position.Y ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    72
                localHistory[i][(int)JointType.HandLeft].Position.Y > localHistory[i][(int)JointType.HipCenter].Position.Y ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    73
                localHistory[i][(int)JointType.HandLeft].Position.Z > localHistory[i - 1][(int)JointType.HandLeft].Position.Z ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    74
                Math.Abs(localHistory[i][(int)JointType.HandLeft].Position.X - startPointLeft.X) > refDistance / 5 ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    75
                Math.Abs(localHistory[i][(int)JointType.HandLeft].Position.Y - startPointLeft.Y) > refDistance / 5)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    76
                    leftHandOK = false;
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    77
                if (localHistory[i][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.Head].Position.Y ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    78
                localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HipCenter].Position.Y ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    79
                localHistory[i][(int)JointType.HandRight].Position.Z > localHistory[i - 1][(int)JointType.HandRight].Position.Z ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    80
                Math.Abs(localHistory[i][(int)JointType.HandRight].Position.X - startPointRight.X) > refDistance / 5 ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    81
                Math.Abs(localHistory[i][(int)JointType.HandRight].Position.Y - startPointRight.Y) > refDistance / 5)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    82
                    rightHandOK = false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    83
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    84
                if (!leftHandOK && !rightHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    85
                    return Hand.NONE;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    86
            }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    87
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    88
            //Si la distance en Z du geste a été plus courte que la distance N
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    89
            //Alors on retourne faux.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    90
            if (Math.Abs(localHistory[localHistory.Count - 1][(int)JointType.HandLeft].Position.Z - localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandLeft].Position.Z) * 100 < 20)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    91
                leftHandOK = false;
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    92
            if (Math.Abs(localHistory[localHistory.Count - 1][(int)JointType.HandRight].Position.Z - localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandRight].Position.Z) * 100 < 20)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    93
                rightHandOK = false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    94
            
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    95
            //Si la dernière position de la main droite/gauche est sur le côté gauche/droit du corps
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    96
            //OU si la première position calculée de la main droite/gauche est sur le côté gauche/droit du corps
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
    97
            //Alors on retourne faux.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    98
            if (localHistory[localHistory.Count - 1][(int)JointType.HandLeft].Position.X > localHistory[localHistory.Count - 1][(int)JointType.HipCenter].Position.X ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
    99
               localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandLeft].Position.X > localHistory[localHistory.Count - 1][(int)JointType.HipCenter].Position.X)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   100
                leftHandOK = false;
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   101
            if (localHistory[localHistory.Count - 1][(int)JointType.HandRight].Position.X < localHistory[localHistory.Count - 1][(int)JointType.HipCenter].Position.X ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   102
               localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandRight].Position.X < localHistory[localHistory.Count - 1][(int)JointType.HipCenter].Position.X)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   103
                rightHandOK = false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   104
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   105
            if (!leftHandOK && !rightHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   106
                return Hand.NONE;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   107
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   108
            //On supprime l'historique local.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   109
            localHistory.Clear();
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   110
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   111
            debug.ExceptionLbl.Background = System.Windows.Media.Brushes.White;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   112
            //Si on est arrivé jusqu'ici, toutes les conditions pour un push ont été remplies.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   113
            
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   114
            if (leftHandOK && rightHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   115
                return Hand.BOTH;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   116
            else if (leftHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   117
                return Hand.LEFT;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   118
            else if (rightHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   119
                return Hand.RIGHT;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   120
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   121
            return Hand.NONE;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   122
        }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   123
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   124
        /*
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   125
         * Lit les noeuds de l'historique du squelette afin de détecter un Pull.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   126
         * Règles :
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   127
         * Se fait avec une main.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   128
         * Chaque nouvelle position de la main doit être moins profonde que la précédente.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   129
         * Chaque nouvelle position de la main ne doit pas dévier trop de l'axe perpendiculaire au plan (X, Y).
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   130
         * Le geste doit mesurer en profondeur une certaine distance.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   131
         */
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   132
        public Hand CheckForPull()
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   133
        {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   134
            //Crée un historique de squelette local, puisque l'historique est mis à jour toutes les ~1/30 s.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   135
            List<List<Joint>> localHistory = new List<List<Joint>>(history);
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   136
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   137
            //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   138
            if (localHistory.Count < indexesToCheck + 1)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   139
                return Hand.NONE;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   140
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   141
            //La distance de référence est ici la distance entre le milieu du dos et le milieu des épaules.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   142
            refDistance = Math.Abs(localHistory[0][(int)JointType.Spine].Position.Y - localHistory[0][(int)JointType.ShoulderCenter].Position.Y);
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   143
            //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   144
            SkeletonPoint startPointLeft = localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandLeft].Position;
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   145
            SkeletonPoint startPointRight = localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandRight].Position;
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   146
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   147
            //Booléens indiquant si le mouvement serait valide pour la main gauche ou droite.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   148
            bool leftHandOK = true, rightHandOK = true;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   149
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   150
            //De la position p1 à pn, on suit l'algorithme.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   151
            for (int i = localHistory.Count - indexesToCheck + 1; i < localHistory.Count; i++)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   152
            {
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   153
                //Si la position Y de la main est plus haute que la tête
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   154
                //OU si la position Y de la main est plus basse que la hanche
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   155
                //OU si la nouvelle position Z de la main est plus profonde que la précédente
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   156
                //OU si la nouvelle position X de la main est plus éloignée de la distance N par rapport à la première position X
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   157
                //OU si la nouvelle position Y de la main est plus éloignée de la distance N par rapport à la première position Y
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   158
                //Alors la main en question ne fait pas de push.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   159
                if (localHistory[i][(int)JointType.HandLeft].Position.Y < localHistory[i][(int)JointType.Head].Position.Y ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   160
                localHistory[i][(int)JointType.HandLeft].Position.Y > localHistory[i][(int)JointType.HipCenter].Position.Y ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   161
                localHistory[i][(int)JointType.HandLeft].Position.Z < localHistory[i - 1][(int)JointType.HandLeft].Position.Z ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   162
                Math.Abs(localHistory[i][(int)JointType.HandLeft].Position.X - startPointLeft.X) > refDistance / 5 ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   163
                Math.Abs(localHistory[i][(int)JointType.HandLeft].Position.Y - startPointLeft.Y) > refDistance / 5)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   164
                    leftHandOK = false;
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   165
                if (localHistory[i][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.Head].Position.Y ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   166
                localHistory[i][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HipCenter].Position.Y ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   167
                localHistory[i][(int)JointType.HandRight].Position.Z < localHistory[i - 1][(int)JointType.HandRight].Position.Z ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   168
                Math.Abs(localHistory[i][(int)JointType.HandRight].Position.X - startPointRight.X) > refDistance / 5 ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   169
                Math.Abs(localHistory[i][(int)JointType.HandRight].Position.Y - startPointRight.Y) > refDistance / 5)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   170
                    rightHandOK = false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   171
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   172
                if (!leftHandOK && !rightHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   173
                    return Hand.NONE;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   174
            }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   175
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   176
            //Si la distance en Z du geste a été plus courte que la distance N
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   177
            //Alors on retourne faux.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   178
            if (Math.Abs(localHistory[localHistory.Count - 1][(int)JointType.HandLeft].Position.Z - localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandLeft].Position.Z) * 100 < 20)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   179
                leftHandOK = false;
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   180
            if (Math.Abs(localHistory[localHistory.Count - 1][(int)JointType.HandRight].Position.Z - localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandRight].Position.Z) * 100 < 20)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   181
                rightHandOK = false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   182
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   183
            //Si la dernière position de la main droite/gauche est sur le côté gauche/droit du corps
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   184
            //OU si la première position calculée de la main droite/gauche est sur le côté gauche/droit du corps
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   185
            //Alors on retourne faux.
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   186
            if (localHistory[localHistory.Count - 1][(int)JointType.HandLeft].Position.X > localHistory[localHistory.Count - 1][(int)JointType.HipCenter].Position.X ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   187
               localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandLeft].Position.X > localHistory[localHistory.Count - 1][(int)JointType.HipCenter].Position.X)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   188
                leftHandOK = false;
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   189
            if (localHistory[localHistory.Count - 1][(int)JointType.HandRight].Position.X < localHistory[localHistory.Count - 1][(int)JointType.HipCenter].Position.X ||
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   190
               localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandRight].Position.X < localHistory[localHistory.Count - 1][(int)JointType.HipCenter].Position.X)
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   191
                rightHandOK = false;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   192
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   193
            if (!leftHandOK && !rightHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   194
                return Hand.NONE;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   195
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   196
            //On supprime l'historique local.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   197
            localHistory.Clear();
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   198
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   199
            debug.ExceptionLbl.Background = System.Windows.Media.Brushes.Black;
5
d40f84d77db4 Documentations (readme)
bastiena
parents: 4
diff changeset
   200
            
4
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   201
            //Si on est arrivé jusqu'ici, toutes les conditions pour un push ont été remplies.
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   202
            if (leftHandOK && rightHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   203
                return Hand.BOTH;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   204
            else if (leftHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   205
                return Hand.LEFT;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   206
            else if (rightHandOK)
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   207
                return Hand.RIGHT;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   208
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   209
            return Hand.NONE;
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   210
        }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   211
    }
f4e52a4c34b3 Removing jars and cs unused classes.
bastiena
parents:
diff changeset
   212
}