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