middleware/src/Tracking/Gestures/UserPositionDetector.cs
author bastiena
Tue, 20 Mar 2012 18:00:55 +0100
changeset 7 8a21bec5d45f
parent 6 93dfb08dcc97
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:
6
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     1
/*
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     2
 * Projet : TraKERS
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     3
 * Module : MIDDLEWARE
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     4
 * Sous-Module : Tracking/Gestures
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     5
 * Classe : UserPositionDetector
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     6
 * 
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     7
 * Auteur : alexandre.bastien@iri.centrepompidou.fr
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     8
 * 
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
     9
 * Fonctionnalités : Permet de détecter si l'utilisateur s'est déplacé dans la zone de détection, en se basant
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    10
 * sur la distance de l'utilisateur à Kinect.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    11
 */
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    12
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    13
using System;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    14
using System.Collections.Generic;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    15
using System.Linq;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    16
using System.Text;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    17
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    18
namespace Trakers.Tracking.Gestures
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    19
{
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    20
    public class UserPositionDetector
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    21
    {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    22
        Debug.DebugWindow debug;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    23
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    24
        float minDistance, maxDistance, zeroPoint;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    25
        float searchMinDistance, searchMaxDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    26
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    27
        static int n = 0;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    28
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    29
        /*
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    30
         * Le constructeur prend en entrée le debug mais aussi les principales distances qui délimitent la
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    31
         * zone de détection.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    32
         */
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    33
        public UserPositionDetector(Debug.DebugWindow _d, float _minDistance, float _maxDistance, float _zeroPoint, float _searchMinDistance, float _searchMaxDistance)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    34
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    35
            minDistance = _minDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    36
            maxDistance = _maxDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    37
            searchMinDistance = _searchMinDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    38
            searchMaxDistance = _searchMaxDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    39
            zeroPoint = _zeroPoint;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    40
            debug = _d;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    41
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    42
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    43
        /*
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    44
         * Getters et Setters des distances (dans le cadre d'une modification des paramètres).
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    45
         */
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    46
        public void setMinDistance(float dist)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    47
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    48
            minDistance = dist;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    49
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    50
        public void setMaxDistance(float dist)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    51
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    52
            maxDistance = dist;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    53
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    54
        public void setSearchMinDistance(float dist)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    55
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    56
            searchMinDistance = dist;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    57
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    58
        public void setSearchMaxDistance(float dist)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    59
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    60
            searchMaxDistance = dist;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    61
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    62
        public void setZeroPoint(float dist)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    63
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    64
            zeroPoint = dist;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    65
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    66
        public void setParams(float minDist, float maxDist, float minDistHands, float maxDistHands, float zero)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    67
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    68
            //On charge tous les paramètres d'un coup.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    69
            minDistance = minDist;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    70
            maxDistance = maxDist;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    71
            searchMinDistance = minDistHands;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    72
            searchMaxDistance = maxDistHands;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    73
            zeroPoint = zero;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    74
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    75
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    76
        public float getMinDistance()
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    77
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    78
            return minDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    79
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    80
        public float getMaxDistance()
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    81
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    82
            return maxDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    83
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    84
        public float getSearchMinDistance()
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    85
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    86
            return searchMinDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    87
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    88
        public float getSearchMaxDistance()
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    89
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    90
            return searchMaxDistance;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    91
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    92
        public float getZeroPoint()
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    93
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    94
            return zeroPoint;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    95
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    96
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    97
        /*
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    98
         * Lit la position de l'utilisateur à Kinect et ressort un pourcentage de proximité.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
    99
         * Règles : Droite affine de coefficient négatif.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   100
         * .
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   101
         */
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   102
        public float CalcProximity(float distance)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   103
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   104
            //Si on se trouve trop loin.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   105
            if (distance > maxDistance)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   106
                return 0.0f;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   107
            //Si on se trouve trop près.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   108
            if (distance < searchMinDistance)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   109
                return 0.0f;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   110
            //Si on n'est pas encore trop près mais qu'on dépasse le point zéro.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   111
            if (distance < zeroPoint)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   112
                return 100.0f;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   113
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   114
            //Equation, de droite affine à partir de deux points.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   115
            //Ici 99 tout simplement car 100 - 1, les limites de pourcentage de proximité.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   116
            float a = 99/((float)zeroPoint - maxDistance);
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   117
            float b = 100 - a * zeroPoint;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   118
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   119
            return a * distance + b;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   120
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   121
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   122
        /*
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   123
         * Estime le nombre de vidéos à afficher en fonction du pourcentage de proximité et du nombre de
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   124
         * vidéos dans la mosaïque.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   125
         * .
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   126
         */
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   127
        public int ImagesToShow(float proximity, int N)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   128
        {
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   129
            //Si la proximité est nulle, on retourne 0.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   130
            if (proximity == 0f)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   131
                return 0;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   132
            //Si on n'est pas encore trop près mais qu'on dépasse le point zéro.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   133
            if (proximity >= 90f)
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   134
                return N;
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   135
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   136
            //Pour chaque intervalle de déciles (dans les pourcentages), le nombre de dizaines
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   137
            //du pourcentage de proximité plus un, fois le nombre de dizaines d'images seront affichées.
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   138
            return (((int)proximity / 10) + 1) * ((int)N / 2);
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   139
        }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   140
    }
93dfb08dcc97 Middleware :
bastiena
parents:
diff changeset
   141
}