owlps/owlps-positioning/referencepoint.cc

150 lines
2.8 KiB
C++
Raw Normal View History

#include "referencepoint.hh"
GuiNuMo : gestion topologie server.{hh,cc} : * Utilisation d'une map plutôt que d'une multimap pour stocker la liste des pièces. Conséquence : les noms des zones doivent être uniques, il faut donc numéroter les zones des pièces composites (par exemple « Couloir N1 A » et « Couloir N1 B »). * Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des zones auxquelles appartient un point. * Modification de la fonction makeWaypointDistancesFromFile() (renommée makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice des distances entre points de passage (lecture d'une liste de points). Abandon du format décrivant les points en visibilité (voir le fichier cfg/distances.csv, supprimé à cette révision), puisque nous nous servons des points de passage et de la description des zones pour calculer les liens entre points. RESTE À FAIRE : prise en comppte de la topologie dans le calcul de distance. * Ajout de deux fonctions areaConnection() qui permettent de récupérer la liste des points de passage d'une zone, ou faisant l'intersection entre deux zones. * Ajout de la fonction distanceTopology, qui calcule la distance entre deux points en tenant compte de la topologie (zones et points de passage entre elles). * Ajout de la fonction makeReferencePointDistances(), qui calcule les distances entre points de référence, en tenant compte de la topologie. * Ajout de la fonction point_vector_idx(), semblable à point_tab_idx() mais pour un vector<Point>. referencepoint.{hh,cc} : * Ajout de l'operator de cast en Point (operator Point()). area.{hh,cc} : * Ajout de l'operator==(Area). cfg/distances.csv * Suppression de ce fichier obsolète. git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
float ReferencePoint::getSsSquareDistance(const vector<Measurement> &m)const
{
unsigned int i, j;
float ret = 0;
bool found;
vector<Measurement> ref_m = measurement_list;
vector<Measurement> test_m = m;
Measurement new_meas;
new_meas.addSsValue(-95);
/* Complete measurement vector with unexisting ap (from ref point) */
for(i = 0 ; i < ref_m.size() ; i++)
{
found = false;
for(j = 0 ; j < test_m.size() && !found ; j++)
if(test_m[j].getMacAddr() == ref_m[i].getMacAddr())
found = true;
if(!found)
{
new_meas.setMacAddr(measurement_list[i].getMacAddr());
test_m.push_back(new_meas);
}
}
/* Now, complete ref. point meas. */
for(i = 0 ; i < test_m.size() ; i++)
{
found = false;
for(j = 0 ; j < ref_m.size() && !found ; j++)
if(test_m[i].getMacAddr() == ref_m[j].getMacAddr())
found = true;
if(!found)
{
new_meas.setMacAddr(test_m[i].getMacAddr());
ref_m.push_back(new_meas);
}
}
/* Now, compute SS distance */
for (i = 0 ; i < test_m.size() ; i++)
{
j = 0;
found = false;
while((j < ref_m.size())&&(found == false))
{
if(ref_m[j].getMacAddr() == test_m[i].getMacAddr())
{
found = true;
ret += ref_m[j].getSsSquareDistance(test_m[i].getAverage());
}
j++;
}
}
ref_m.clear();
test_m.clear();
return ret;
}
GuiNuMo : gestion topologie server.{hh,cc} : * Utilisation d'une map plutôt que d'une multimap pour stocker la liste des pièces. Conséquence : les noms des zones doivent être uniques, il faut donc numéroter les zones des pièces composites (par exemple « Couloir N1 A » et « Couloir N1 B »). * Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des zones auxquelles appartient un point. * Modification de la fonction makeWaypointDistancesFromFile() (renommée makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice des distances entre points de passage (lecture d'une liste de points). Abandon du format décrivant les points en visibilité (voir le fichier cfg/distances.csv, supprimé à cette révision), puisque nous nous servons des points de passage et de la description des zones pour calculer les liens entre points. RESTE À FAIRE : prise en comppte de la topologie dans le calcul de distance. * Ajout de deux fonctions areaConnection() qui permettent de récupérer la liste des points de passage d'une zone, ou faisant l'intersection entre deux zones. * Ajout de la fonction distanceTopology, qui calcule la distance entre deux points en tenant compte de la topologie (zones et points de passage entre elles). * Ajout de la fonction makeReferencePointDistances(), qui calcule les distances entre points de référence, en tenant compte de la topologie. * Ajout de la fonction point_vector_idx(), semblable à point_tab_idx() mais pour un vector<Point>. referencepoint.{hh,cc} : * Ajout de l'operator de cast en Point (operator Point()). area.{hh,cc} : * Ajout de l'operator==(Area). cfg/distances.csv * Suppression de ce fichier obsolète. git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
void ReferencePoint::addMeasurement(const string &mac_a, const int &value)
{
unsigned int i;
Measurement m;
bool inserted = false;
for (i = 0 ; i < measurement_list.size() ; i++)
if(measurement_list[i].getMacAddr() == mac_a)
{
measurement_list[i].addSsValue(value);
inserted = true;
break;
}
if(inserted == false)
{
m.setMacAddr(mac_a);
m.addSsValue(value);
measurement_list.push_back(m);
}
}
GuiNuMo : gestion topologie server.{hh,cc} : * Utilisation d'une map plutôt que d'une multimap pour stocker la liste des pièces. Conséquence : les noms des zones doivent être uniques, il faut donc numéroter les zones des pièces composites (par exemple « Couloir N1 A » et « Couloir N1 B »). * Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des zones auxquelles appartient un point. * Modification de la fonction makeWaypointDistancesFromFile() (renommée makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice des distances entre points de passage (lecture d'une liste de points). Abandon du format décrivant les points en visibilité (voir le fichier cfg/distances.csv, supprimé à cette révision), puisque nous nous servons des points de passage et de la description des zones pour calculer les liens entre points. RESTE À FAIRE : prise en comppte de la topologie dans le calcul de distance. * Ajout de deux fonctions areaConnection() qui permettent de récupérer la liste des points de passage d'une zone, ou faisant l'intersection entre deux zones. * Ajout de la fonction distanceTopology, qui calcule la distance entre deux points en tenant compte de la topologie (zones et points de passage entre elles). * Ajout de la fonction makeReferencePointDistances(), qui calcule les distances entre points de référence, en tenant compte de la topologie. * Ajout de la fonction point_vector_idx(), semblable à point_tab_idx() mais pour un vector<Point>. referencepoint.{hh,cc} : * Ajout de l'operator de cast en Point (operator Point()). area.{hh,cc} : * Ajout de l'operator==(Area). cfg/distances.csv * Suppression de ce fichier obsolète. git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
bool ReferencePoint::getPowerForAp(const string &ap_mac, float *p)const
{
unsigned int i;
string str;
string macLowerCase;
str=ap_mac;
//Pour convertir les majuscules en miniscules
const int length=str.length();
for(int j=0; j < length; ++j)
{
str[j] = std::tolower(str[j]);
}
for (i = 0 ; i < measurement_list.size() ; i++)
if(measurement_list[i].getMacAddr() == str)
{
*p = measurement_list[i].getAverage();
return true;
}
return false;
GuiNuMo : gestion topologie server.{hh,cc} : * Utilisation d'une map plutôt que d'une multimap pour stocker la liste des pièces. Conséquence : les noms des zones doivent être uniques, il faut donc numéroter les zones des pièces composites (par exemple « Couloir N1 A » et « Couloir N1 B »). * Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des zones auxquelles appartient un point. * Modification de la fonction makeWaypointDistancesFromFile() (renommée makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice des distances entre points de passage (lecture d'une liste de points). Abandon du format décrivant les points en visibilité (voir le fichier cfg/distances.csv, supprimé à cette révision), puisque nous nous servons des points de passage et de la description des zones pour calculer les liens entre points. RESTE À FAIRE : prise en comppte de la topologie dans le calcul de distance. * Ajout de deux fonctions areaConnection() qui permettent de récupérer la liste des points de passage d'une zone, ou faisant l'intersection entre deux zones. * Ajout de la fonction distanceTopology, qui calcule la distance entre deux points en tenant compte de la topologie (zones et points de passage entre elles). * Ajout de la fonction makeReferencePointDistances(), qui calcule les distances entre points de référence, en tenant compte de la topologie. * Ajout de la fonction point_vector_idx(), semblable à point_tab_idx() mais pour un vector<Point>. referencepoint.{hh,cc} : * Ajout de l'operator de cast en Point (operator Point()). area.{hh,cc} : * Ajout de l'operator==(Area). cfg/distances.csv * Suppression de ce fichier obsolète. git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
}
ReferencePoint ReferencePoint::operator=(const ReferencePoint &rp)
{
if(this == &rp)
return *this;
coordinates = rp.coordinates;
measurement_list = rp.measurement_list;
return *this;
}
GuiNuMo : gestion topologie server.{hh,cc} : * Utilisation d'une map plutôt que d'une multimap pour stocker la liste des pièces. Conséquence : les noms des zones doivent être uniques, il faut donc numéroter les zones des pièces composites (par exemple « Couloir N1 A » et « Couloir N1 B »). * Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des zones auxquelles appartient un point. * Modification de la fonction makeWaypointDistancesFromFile() (renommée makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice des distances entre points de passage (lecture d'une liste de points). Abandon du format décrivant les points en visibilité (voir le fichier cfg/distances.csv, supprimé à cette révision), puisque nous nous servons des points de passage et de la description des zones pour calculer les liens entre points. RESTE À FAIRE : prise en comppte de la topologie dans le calcul de distance. * Ajout de deux fonctions areaConnection() qui permettent de récupérer la liste des points de passage d'une zone, ou faisant l'intersection entre deux zones. * Ajout de la fonction distanceTopology, qui calcule la distance entre deux points en tenant compte de la topologie (zones et points de passage entre elles). * Ajout de la fonction makeReferencePointDistances(), qui calcule les distances entre points de référence, en tenant compte de la topologie. * Ajout de la fonction point_vector_idx(), semblable à point_tab_idx() mais pour un vector<Point>. referencepoint.{hh,cc} : * Ajout de l'operator de cast en Point (operator Point()). area.{hh,cc} : * Ajout de l'operator==(Area). cfg/distances.csv * Suppression de ce fichier obsolète. git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
ostream &operator<<(ostream &os, ReferencePoint &rp)
{
unsigned int i;
os << rp.coordinates << endl;
if(rp.measurement_list.size() == 0)
os << "No measurements" << endl;
else
for (i = 0 ; i < rp.measurement_list.size() ; i++)
os << rp.measurement_list[i] << endl;
return os;
}
GuiNuMo : gestion topologie server.{hh,cc} : * Utilisation d'une map plutôt que d'une multimap pour stocker la liste des pièces. Conséquence : les noms des zones doivent être uniques, il faut donc numéroter les zones des pièces composites (par exemple « Couloir N1 A » et « Couloir N1 B »). * Ajout de la fonction inWhichAreas() qui permet d'obtenir la liste des zones auxquelles appartient un point. * Modification de la fonction makeWaypointDistancesFromFile() (renommée makeWaypointListFromFile()) de manière à ce qu'elle calcule la matrice des distances entre points de passage (lecture d'une liste de points). Abandon du format décrivant les points en visibilité (voir le fichier cfg/distances.csv, supprimé à cette révision), puisque nous nous servons des points de passage et de la description des zones pour calculer les liens entre points. RESTE À FAIRE : prise en comppte de la topologie dans le calcul de distance. * Ajout de deux fonctions areaConnection() qui permettent de récupérer la liste des points de passage d'une zone, ou faisant l'intersection entre deux zones. * Ajout de la fonction distanceTopology, qui calcule la distance entre deux points en tenant compte de la topologie (zones et points de passage entre elles). * Ajout de la fonction makeReferencePointDistances(), qui calcule les distances entre points de référence, en tenant compte de la topologie. * Ajout de la fonction point_vector_idx(), semblable à point_tab_idx() mais pour un vector<Point>. referencepoint.{hh,cc} : * Ajout de l'operator de cast en Point (operator Point()). area.{hh,cc} : * Ajout de l'operator==(Area). cfg/distances.csv * Suppression de ce fichier obsolète. git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@47 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-06-25 16:19:07 +02:00
/* Opérateur de cast en Point */
ReferencePoint::operator Point() const
{
return coordinates ;
}