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