middleware/src/Tracking/Gestures/UserPositionDetector.cs
author bastiena
Mon, 19 Mar 2012 18:24:59 +0100
changeset 6 93dfb08dcc97
child 8 e4e7db2435f8
permissions -rw-r--r--
Middleware : User position events + detector (proximity). More parameters, like proximity bounds.
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
}