middleware/Tracking/Gestures/CircleDetector.cs
author bastiena
Thu, 05 Apr 2012 15:54:44 +0200
changeset 17 fda26bfcabef
parent 15 4b78f179e7ce
child 27 6c08d4d7219e
permissions -rw-r--r--
Middleware : new gesture implemented : WAVE new kind of detection : postures new postures implemented : BEND KNEE_UP CROSS (developpement, but should be dropped because of collisions with SWIPE gestures) Gesture/Posture detectors got a link towards Debug (For debug purpose only, will be removed later)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     1
/*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     2
* This file is part of the TraKERS\Middleware package.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     3
*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     4
* (c) IRI <http://www.iri.centrepompidou.fr/>
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     5
*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     6
* For the full copyright and license information, please view the LICENSE_MIDDLEWARE
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     7
* file that was distributed with this source code.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     8
*/
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
     9
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    10
/*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    11
 * Projet : TraKERS
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    12
 * Module : MIDDLEWARE
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    13
 * Sous-Module : Tracking/Gestures
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    14
 * Classe : CircleDetector
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    15
 * 
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    16
 * Auteur : alexandre.bastien@iri.centrepompidou.fr
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    17
 * 
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    18
 * Fonctionnalités : Permet de détecter si l'utilisateur a effectué un cercle, en se basant sur
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    19
 * des règles appliquées à la positions des noeuds dans le temps.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    20
 */
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    21
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    22
using System;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    23
using System.Collections.Generic;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    24
using System.Linq;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    25
using System.Text;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    26
using Microsoft.Kinect;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    27
using System.Windows.Media.Media3D;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    28
using System.Drawing;
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    29
using Trakers.Debug;
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    30
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    31
namespace Trakers.Tracking.Gestures
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    32
{
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    33
    public class CircleDetector : GestureDetector
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    34
    {
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    35
        public CircleDetector(DebugWindow _debug) : base(_debug)
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    36
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    37
            gesturePeriod = (float)1;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    38
            indexesPerSecond = 30;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    39
            indexesToCheck = (int)(gesturePeriod * indexesPerSecond);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    40
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    41
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    42
        /*
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    43
         * Lit les noeuds de l'historique du squelette afin de détecter un cercle.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    44
         * Règles :
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    45
         * Se fait avec une main.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    46
         * Chaque point est à la même distance du barycentre.
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    47
         * On regarde pour la main gauche.
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    48
         */
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    49
        public bool CheckForLeftCircle()
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    50
        {
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    51
            //Indique si la main gauche a décrit un cercle.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    52
            bool leftHandDoCircle = true;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    53
            
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    54
            //Crée un historique de squelette local, puisque l'historique est mis à jour toutes les ~1/30 s.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    55
            List<List<Joint>> localHistory = new List<List<Joint>>(history);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    56
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    57
            //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    58
            if (localHistory.Count < indexesToCheck + 1)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    59
                return false;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    60
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    61
            //La distance de référence est ici la distance entre le milieu du dos et le milieu des épaules.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    62
            refDistance = Math.Abs(localHistory[0][(int)JointType.Spine].Position.Y - localHistory[0][(int)JointType.ShoulderCenter].Position.Y);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    63
            //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    64
            SkeletonPoint startPointLeft = localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandRight].Position;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    65
            
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    66
            //Barycentres pour les mains.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    67
            PointF leftBarycenter = new PointF(0, 0);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    68
            //Distances moyennes des points aux barycentres.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    69
            float averageDistToLeftBarycenter = 0;
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    70
            
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    71
            //Index du point de départ dans la détection.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    72
            int beginIndex = localHistory.Count - indexesToCheck;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    73
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    74
            //Calcul du barycentre de la main gauche.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    75
            for (int i = beginIndex; i > 0; i--)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    76
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    77
                leftBarycenter.X += localHistory[i][(int)JointType.HandLeft].Position.X;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    78
                leftBarycenter.Y += localHistory[i][(int)JointType.HandLeft].Position.Y;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    79
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    80
            leftBarycenter.X /= indexesToCheck;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    81
            leftBarycenter.Y /= indexesToCheck;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    82
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    83
            //Estimation de la distance moyenne d'un point au barycentre gauche.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    84
            for (int i = beginIndex; i > 0; i--)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    85
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    86
                float ptX = localHistory[i][(int)JointType.HandLeft].Position.X;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    87
                float ptY = localHistory[i][(int)JointType.HandLeft].Position.Y;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    88
                averageDistToLeftBarycenter += (float)Distance2D(ptX, leftBarycenter.X, ptY, leftBarycenter.Y);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    89
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    90
            averageDistToLeftBarycenter /= indexesToCheck;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
    91
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    92
            //Pour les points, on suit l'algorithme.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    93
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    94
            //Si la distance moyenne de chaque point de la main gauche au barycentre gauche est trop faible
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    95
            //Alors la main gauche n'a pas décrit de cercle.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    96
            if (averageDistToLeftBarycenter < refDistance / 2)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    97
                leftHandDoCircle = false;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    98
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
    99
            //Indique si on a atteint le point d'arrivée pour la main gauche.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   100
            bool endLeftReached = false;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   101
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   102
            if(leftHandDoCircle)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   103
                for (int i = localHistory.Count - indexesToCheck + 1; i < localHistory.Count; i++)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   104
                {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   105
                    //Si la distance d'un point de la main gauche excède à la distance moyenne au barycentre gauche avec une erreur N
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   106
                    //OU si le point de départ de la main gauche est plus éloigné du point d'arrivée de la main gauche de N.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   107
                    //Alors la main gauche n'a pas décrit de cercle.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   108
                    float X = localHistory[i][(int)JointType.HandLeft].Position.X;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   109
                    float Y = localHistory[i][(int)JointType.HandLeft].Position.Y;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   110
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   111
                    //Si un point est proche du point de départ.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   112
                    if(Distance2D(X, Y, startPointLeft.X, startPointLeft.Y) < refDistance / 5 && X != startPointLeft.X && Y != startPointLeft.Y)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   113
                        endLeftReached = true;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   114
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   115
                    if (Math.Abs((double)Distance2D(X, Y, leftBarycenter.X, leftBarycenter.Y) - averageDistToLeftBarycenter) > refDistance / 5)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   116
                    {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   117
                        leftHandDoCircle = false;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   118
                        break;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   119
                    }
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   120
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   121
                    //Si la main gauche a atteint une position proche de son point de départ.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   122
                    if (endLeftReached)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   123
                    {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   124
                        //S'il y a trop peu de points
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   125
                        if (i - (localHistory.Count - indexesToCheck + 1) < (indexesToCheck / 2))
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   126
                            leftHandDoCircle = false;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   127
                        break;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   128
                    }
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   129
                }
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   130
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   131
            //On supprime l'historique local.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   132
            localHistory.Clear();
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   133
            //Si on est arrivé jusqu'ici, toutes les conditions pour un swipe left ont été remplies.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   134
            return leftHandDoCircle;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   135
        }
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   136
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   137
        /*
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   138
         * Lit les noeuds de l'historique du squelette afin de détecter un cercle.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   139
         * Règles :
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   140
         * Se fait avec une main.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   141
         * Chaque point est à la même distance du barycentre.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   142
         * On regarde pour la main droite.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   143
         */
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   144
        public bool CheckForRightCircle()
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   145
        {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   146
            //Indique si la main droite a décrit un cercle.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   147
            bool rightHandDoCircle = true;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   148
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   149
            //Crée un historique de squelette local, puisque l'historique est mis à jour toutes les ~1/30 s.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   150
            List<List<Joint>> localHistory = new List<List<Joint>>(history);
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   151
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   152
            //if (Math.Abs(Math.Abs(localHistory[0][(int)JointType.HandLeft].Position.X - localHistory[0][(int)JointType.HandRight].Position.X) - refDistance) < 10)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   153
              //  Console.Out.WriteLine("REF");
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   154
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   155
            //Si il n'y a pas assez de positions dans l'historique local pour vérifier le geste.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   156
            if (localHistory.Count < indexesToCheck + 1)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   157
                return false;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   158
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   159
            //La distance de référence est ici la distance entre le milieu du dos et le milieu des épaules.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   160
            refDistance = Math.Abs(localHistory[0][(int)JointType.Spine].Position.Y - localHistory[0][(int)JointType.ShoulderCenter].Position.Y);
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   161
            //On commence la position pour les indexesToCheck dernières postures (celle à l'index 0 étant la dernière).
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   162
            SkeletonPoint startPointRight = localHistory[localHistory.Count - indexesToCheck][(int)JointType.HandRight].Position;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   163
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   164
            //Barycentres pour la main droite.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   165
            PointF rightBarycenter = new PointF(0, 0);
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   166
            //Distances moyennes des points aux barycentres.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   167
            float averageDistToRightBarycenter = 0;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   168
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   169
            //Index du point de départ dans la détection.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   170
            int beginIndex = localHistory.Count - indexesToCheck;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   171
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   172
            //Index du point d'arrivée.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   173
            int endRightIndex = 0;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   174
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   175
            //On cherche le point d'arrivée.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   176
            /*for (int i = beginIndex; i > 0; i--)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   177
            {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   178
                float X = localHistory[i][(int)JointType.HandRight].Position.X;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   179
                float Y = localHistory[i][(int)JointType.HandRight].Position.Y;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   180
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   181
                //Si un point est proche du point de départ.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   182
                if (Distance2D(X, Y, startPointRight.X, startPointRight.Y) < refDistance / 2 && X != startPointRight.X && Y != startPointRight.Y)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   183
                {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   184
                    Console.Out.WriteLine("REACHED");
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   185
                    endRightIndex = i;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   186
                    break;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   187
                }
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   188
            }*/
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   189
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   190
            /*//S'il n'y a pas assez de points.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   191
            if (beginIndex - endRightIndex < indexesToCheck)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   192
                return false;*/
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   193
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   194
            //Calcul du barycentre de la main droite.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   195
            for (int i = localHistory.Count - indexesToCheck + 1; i < localHistory.Count; i++)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   196
            {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   197
                rightBarycenter.X += localHistory[i][(int)JointType.HandRight].Position.X;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   198
                rightBarycenter.Y += localHistory[i][(int)JointType.HandRight].Position.Y;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   199
            }
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   200
            rightBarycenter.X /= indexesToCheck;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   201
            rightBarycenter.Y /= indexesToCheck;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   202
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   203
            //Estimation de la distance moyenne d'un point au barycentre droit.
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   204
            for (int i = localHistory.Count - indexesToCheck + 1; i < localHistory.Count; i++)
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   205
            {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   206
                float ptX = localHistory[i][(int)JointType.HandRight].Position.X;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   207
                float ptY = localHistory[i][(int)JointType.HandRight].Position.Y;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   208
                averageDistToRightBarycenter += (float)Distance2D(ptX, rightBarycenter.X, ptY, rightBarycenter.Y);
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   209
            }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   210
            averageDistToRightBarycenter /= indexesToCheck;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   211
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   212
            //Pour les points, on suit l'algorithme.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   213
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   214
            //Si la distance moyenne de chaque point de la main droite au barycentre droit est trop faible
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   215
            //Alors la main droite n'a pas décrit de cercle.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   216
            if (averageDistToRightBarycenter < refDistance / 2)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   217
                rightHandDoCircle = false;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   218
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   219
            float globalPercent = 0;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   220
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   221
            if (rightHandDoCircle)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   222
                for (int i = localHistory.Count - indexesToCheck + 1; i < localHistory.Count; i++)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   223
                {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   224
                    //Si la distance moyenne de chaque point de la main droite au barycentre droit est trop faible
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   225
                    //OU si la distance d'un point de la main droite excède à la distance moyenne au barycentre droit avec une erreur N
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   226
                    //OU si le point de départ de la main gauche est plus éloigné du point d'arrivée de la main gauche de N.
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   227
                    //Alors la main droite n'a pas décrit de cercle.
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   228
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   229
                    float X = localHistory[i][(int)JointType.HandRight].Position.X;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   230
                    float Y = localHistory[i][(int)JointType.HandRight].Position.Y;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   231
                    float R = averageDistToRightBarycenter, r = (float)Math.Abs((double)Distance2D(X, Y, rightBarycenter.X, rightBarycenter.Y));
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   232
                    float percent = 0;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   233
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   234
                    if (r < R)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   235
                        percent = 100 * r / R;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   236
                    else
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   237
                        percent = 100 * R / r;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   238
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   239
                    globalPercent += percent;
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   240
17
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   241
                    /*if (Math.Abs((double)Distance2D(X, Y, rightBarycenter.X, rightBarycenter.Y) - averageDistToRightBarycenter) > refDistance / 5)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   242
                    {
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   243
                        //Console.Out.WriteLine("FAIL");
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   244
                        return false;
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   245
                    }*/
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   246
                }
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   247
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   248
            float res = ((float)globalPercent / indexesToCheck);
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   249
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   250
            Console.Out.WriteLine("p:" + ((float)globalPercent / indexesToCheck));
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   251
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   252
            if (res >= 50)
fda26bfcabef Middleware :
bastiena
parents: 15
diff changeset
   253
                Console.In.Read();
15
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   254
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   255
            //On supprime l'historique local.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   256
            localHistory.Clear();
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   257
            //Si on est arrivé jusqu'ici, toutes les conditions pour un swipe left ont été remplies.
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   258
            return true;
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   259
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   260
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   261
        public double Distance2D(float x1, float x2, float y1, float y2)
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   262
        {
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   263
            return Math.Sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   264
        }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   265
    }
4b78f179e7ce Middleware :
bastiena
parents:
diff changeset
   266
}