|
6
|
1 |
/* |
|
8
|
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 |
/* |
|
6
|
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 |
} |