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