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 } |
|