middleware/src/Tracking/Gestures/JumpDetector.cs
changeset 5 d40f84d77db4
parent 4 f4e52a4c34b3
child 8 e4e7db2435f8
equal deleted inserted replaced
4:f4e52a4c34b3 5:d40f84d77db4
     6  * 
     6  * 
     7  * Auteur : alexandre.bastien@iri.centrepompidou.fr
     7  * Auteur : alexandre.bastien@iri.centrepompidou.fr
     8  * 
     8  * 
     9  * Fonctionnalités : Permet de détecter si l'utilisateur a sauté, en se basant sur
     9  * Fonctionnalités : Permet de détecter si l'utilisateur a sauté, en se basant sur
    10  * des règles appliquées à la positions des noeuds dans le temps.
    10  * des règles appliquées à la positions des noeuds dans le temps.
       
    11  * 
       
    12  * P.S : Cette partie est encore en développement.
    11  */
    13  */
    12 
    14 
    13 using System;
    15 using System;
    14 using System.Collections.Generic;
    16 using System.Collections.Generic;
    15 using System.Linq;
    17 using System.Linq;
    59              * 
    61              * 
    60              * HeadFarAboveBaseLine
    62              * HeadFarAboveBaseLine
    61              */
    63              */
    62 
    64 
    63             //La distance de référence est ici la distance entre le milieu du dos et le milieu des épaules.
    65             //La distance de référence est ici la distance entre le milieu du dos et le milieu des épaules.
    64             refDistance = Math.Abs(localHistory[0][spineID].Position.Y - localHistory[0][shoulderCenterID].Position.Y);
    66             refDistance = Math.Abs(localHistory[0][(int)JointType.Spine].Position.Y - localHistory[0][(int)JointType.ShoulderCenter].Position.Y);
    65             //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
    67             //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
    66 
    68 
    67             int beginIdx = localHistory.Count - indexesToCheck + 1;
    69             int beginIdx = localHistory.Count - indexesToCheck + 1;
    68             int middleIdx = localHistory.Count - indexesToCheck / 2;
    70             int middleIdx = localHistory.Count - indexesToCheck / 2;
    69 
    71 
    70             bool middleOK = true, topOfJump = false;
    72             //bool middleOK = true
       
    73             bool topOfJump = false;
    71 
    74 
    72             
    75             
    73 
    76 
    74             //De la position p1 à pn, on suit l'algorithme.
    77             //De la position p1 à pn, on suit l'algorithme.
    75             for (int i = beginIdx ; i < localHistory.Count ; i++)
    78             for (int i = beginIdx ; i < localHistory.Count ; i++)
    76             {
    79             {
    77 
    80 
    78                 if (localHistory[i][handRightID].Position.Y < localHistory[beginIdx][handRightID].Position.Y + refDistance &&
    81                 if (localHistory[i][(int)JointType.HandRight].Position.Y < localHistory[beginIdx][(int)JointType.HandRight].Position.Y + refDistance &&
    79                    localHistory[i - 1][handRightID].Position.Y < localHistory[i][handRightID].Position.Y)
    82                    localHistory[i - 1][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.HandRight].Position.Y)
    80                 {
    83                 {
    81                     topOfJump = true;
    84                     topOfJump = true;
    82                     //Console.Out.WriteLine("TOP");
    85                     //Console.Out.WriteLine("TOP");
    83                 }
    86                 }
    84 
    87 
    85                 if (localHistory[i - 1][handRightID].Position.Y > localHistory[i][handRightID].Position.Y && !topOfJump)
    88                 if (localHistory[i - 1][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HandRight].Position.Y && !topOfJump)
    86                     return false;
    89                     return false;
    87 
    90 
    88                 //Si la position Y de la main est plus haute que la tête
    91                 //Si la position Y de la main est plus haute que la tête
    89                 //OU si la position Y de la main est plus basse que la hanche
    92                 //OU si la position Y de la main est plus basse que la hanche
    90                 //OU si la nouvelle position Z de la main est moins profonde que la précédente
    93                 //OU si la nouvelle position Z de la main est moins profonde que la précédente
    91                 //OU si la nouvelle position X de la main est plus éloignée de la distance N par rapport à la première position X
    94                 //OU si la nouvelle position X de la main est plus éloignée de la distance N par rapport à la première position X
    92                 //OU si la nouvelle position Y de la main est plus éloignée de la distance N par rapport à la première position Y
    95                 //OU si la nouvelle position Y de la main est plus éloignée de la distance N par rapport à la première position Y
    93                 //Alors la main en question ne fait pas de push.
    96                 //Alors la main en question ne fait pas de push.
    94                 if (localHistory[i-1][handRightID].Position.Y > localHistory[i][handRightID].Position.Y &&
    97                 if (localHistory[i - 1][(int)JointType.HandRight].Position.Y > localHistory[i][(int)JointType.HandRight].Position.Y &&
    95                     topOfJump || localHistory[i - 1][handRightID].Position.Y < localHistory[i][handRightID].Position.Y &&
    98                     topOfJump || localHistory[i - 1][(int)JointType.HandRight].Position.Y < localHistory[i][(int)JointType.HandRight].Position.Y &&
    96                     !topOfJump)
    99                     !topOfJump)
    97                     return false;
   100                     return false;
    98             }
   101             }
    99 
   102 
   100             //Console.Out.WriteLine("OK");
   103             //Console.Out.WriteLine("OK");
   107 
   110 
   108             //Si la dernière position de la main droite/gauche est sur le côté gauche/droit du corps
   111             //Si la dernière position de la main droite/gauche est sur le côté gauche/droit du corps
   109             //OU si la première position calculée de la main droite/gauche est sur le côté gauche/droit du corps
   112             //OU si la première position calculée de la main droite/gauche est sur le côté gauche/droit du corps
   110             //Alors on retourne faux.
   113             //Alors on retourne faux.
   111             
   114             
   112             //if(
       
   113 
       
   114             //On supprime l'historique local.
   115             //On supprime l'historique local.
   115             //localHistory.Clear(Math.Abs(localHistory[i-1][handRightID].Position.Y));
   116             
   116 
       
   117             debug.ExceptionLbl.Background = System.Windows.Media.Brushes.Yellow;
   117             debug.ExceptionLbl.Background = System.Windows.Media.Brushes.Yellow;
   118             Console.WriteLine("{" + n++ + "}" + "JUMP");
   118             
   119 
       
   120             return false;
   119             return false;
   121         }
   120         }
   122     }
   121     }
   123 }
   122 }