2008-04-11 10:11:29 +02:00
|
|
|
#include "referencepoint.hh"
|
2010-06-02 12:37:43 +02:00
|
|
|
#include "measurement.hh"
|
|
|
|
#include "calibrationrequest.hh"
|
|
|
|
#include "stock.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
|
|
|
|
2010-01-04 17:10:42 +01:00
|
|
|
using namespace std ;
|
2010-06-02 12:37:43 +02:00
|
|
|
using std::tr1::unordered_map ;
|
2010-01-04 17:10:42 +01:00
|
|
|
|
|
|
|
|
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
|
|
|
|
2010-01-16 12:23:07 +01:00
|
|
|
/* *** Constructors *** */
|
2009-12-11 17:56:31 +01:00
|
|
|
|
|
|
|
|
2010-01-16 12:23:07 +01:00
|
|
|
/**
|
2010-02-16 19:31:25 +01:00
|
|
|
* Clears #requests, but does not deallocate the values pointed by
|
2010-01-16 12:23:07 +01:00
|
|
|
* the elements into it.
|
|
|
|
*/
|
2009-12-07 16:03:53 +01:00
|
|
|
ReferencePoint::~ReferencePoint()
|
2010-05-21 10:35:15 +02:00
|
|
|
{
|
2010-02-16 19:31:25 +01:00
|
|
|
requests.clear() ;
|
2010-05-21 10:35:15 +02:00
|
|
|
}
|
2008-04-11 10:11:29 +02:00
|
|
|
|
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
|
|
|
|
|
|
|
|
2010-06-02 12:37:43 +02:00
|
|
|
/* *** Accessors *** */
|
|
|
|
|
|
|
|
|
|
|
|
map<string, Measurement> ReferencePoint::
|
|
|
|
get_all_measurements_sorted() const
|
|
|
|
{
|
|
|
|
map<string, Measurement> all ;
|
|
|
|
|
|
|
|
for (vector<CalibrationRequest*>::const_iterator i = requests.begin() ;
|
|
|
|
i != requests.end() ; ++i)
|
|
|
|
{
|
|
|
|
unordered_map<string, Measurement> measurements =
|
|
|
|
(*i)->get_measurements() ;
|
|
|
|
for (unordered_map<string, Measurement>::const_iterator j =
|
|
|
|
measurements.begin() ; j != measurements.end() ; ++j)
|
|
|
|
if (! all.insert(*j).second)
|
|
|
|
all[j->first].merge(j->second) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
return all ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* *** Operations *** */
|
|
|
|
|
|
|
|
|
|
|
|
float ReferencePoint::ss_square_distance(const Request &source) const
|
|
|
|
{
|
|
|
|
assert(! requests.empty()) ;
|
|
|
|
|
|
|
|
const unordered_map<string, Measurement> &request_measurements =
|
|
|
|
source.get_measurements() ;
|
|
|
|
map<string, Measurement> request_measurements_sorted(
|
|
|
|
request_measurements.begin(),
|
|
|
|
request_measurements.end()) ;
|
|
|
|
|
|
|
|
map<string, Measurement> all_measurements_sorted =
|
|
|
|
get_all_measurements_sorted() ;
|
|
|
|
|
|
|
|
complete_with_dummy_measurements(all_measurements_sorted,
|
|
|
|
request_measurements_sorted) ;
|
|
|
|
|
|
|
|
return compute_ss_square_distance(all_measurements_sorted,
|
|
|
|
request_measurements_sorted) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* APs that have not captured a Request must not have too much weight in
|
|
|
|
* the computation. Thus, in the measurements lists we compare, we add
|
|
|
|
* missing APs with a very low SS value.
|
|
|
|
* Both lists can be completed, depending of the APs they contain.
|
|
|
|
*/
|
|
|
|
void ReferencePoint::complete_with_dummy_measurements(
|
|
|
|
map<string, Measurement> &measurements1,
|
|
|
|
map<string, Measurement> &measurements2) const
|
|
|
|
{
|
|
|
|
assert(! measurements1.empty()) ;
|
|
|
|
assert(! measurements2.empty()) ;
|
|
|
|
|
|
|
|
Measurement dummy ;
|
|
|
|
dummy.add_ss(-98) ; // FIXME: should be the smallest possible value
|
|
|
|
|
|
|
|
for (map<string, Measurement>::const_iterator i =
|
|
|
|
measurements1.begin() ; i != measurements1.end() ; ++i)
|
|
|
|
if (measurements2.find(i->first) == measurements2.end())
|
|
|
|
{
|
|
|
|
dummy.set_ap(&Stock::get_ap(i->first)) ;
|
|
|
|
measurements2[i->first] = dummy ;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (map<string, Measurement>::const_iterator i =
|
|
|
|
measurements2.begin() ; i != measurements2.end() ; ++i)
|
|
|
|
if (measurements1.find(i->first) == measurements1.end())
|
|
|
|
{
|
|
|
|
dummy.set_ap(&Stock::get_ap(i->first)) ;
|
|
|
|
measurements1[i->first] = dummy ;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Both lists must have the same size: you should call
|
|
|
|
* complete_with_dummy_measurements() before
|
|
|
|
* compute_ss_square_distance().
|
|
|
|
*/
|
|
|
|
float ReferencePoint::compute_ss_square_distance(
|
|
|
|
map<string, Measurement> &measurements1,
|
|
|
|
map<string, Measurement> &measurements2) const
|
|
|
|
{
|
|
|
|
assert(measurements1.size() == measurements2.size()) ;
|
|
|
|
|
|
|
|
float distance = 0 ;
|
|
|
|
|
|
|
|
for (map<string, Measurement>::const_iterator i1 =
|
|
|
|
measurements1.begin() ; i1 != measurements1.end() ; ++i1)
|
|
|
|
{
|
|
|
|
map<string, Measurement>::const_iterator i2 =
|
|
|
|
measurements2.find(i1->first) ;
|
|
|
|
assert(i2 != measurements2.end()) ;
|
|
|
|
distance += i1->second.ss_square_distance(
|
|
|
|
i2->second) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
return distance ;
|
|
|
|
}
|
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
|
|
|
|
|
|
|
|
|
|
|
|
2010-01-16 12:23:07 +01:00
|
|
|
/* *** Operators *** */
|
2009-12-11 17:56:31 +01:00
|
|
|
|
|
|
|
|
2010-02-16 19:31:25 +01:00
|
|
|
const ReferencePoint& ReferencePoint::operator=(const ReferencePoint &source)
|
2008-04-11 10:11:29 +02:00
|
|
|
{
|
2010-02-16 19:31:25 +01:00
|
|
|
if (this == &source)
|
2009-12-07 16:03:53 +01:00
|
|
|
return *this ;
|
2008-08-18 18:19:02 +02:00
|
|
|
|
2010-02-16 19:31:25 +01:00
|
|
|
this->Point3D::operator=(source) ;
|
|
|
|
requests = source.requests ;
|
2009-12-07 16:03:53 +01:00
|
|
|
|
|
|
|
return *this ;
|
2008-04-11 10:11:29 +02:00
|
|
|
}
|
|
|
|
|
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
|
|
|
|
2010-02-16 19:31:25 +01:00
|
|
|
bool ReferencePoint::operator==(const ReferencePoint &source) const
|
2009-12-11 17:56:31 +01:00
|
|
|
{
|
2010-02-16 19:31:25 +01:00
|
|
|
if (this == &source)
|
2009-12-11 17:56:31 +01:00
|
|
|
return true ;
|
|
|
|
|
|
|
|
return
|
2010-02-16 19:31:25 +01:00
|
|
|
this->Point3D::operator==(source) &&
|
|
|
|
requests == source.requests ;
|
2009-12-11 17:56:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
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
|
|
|
|
2010-01-04 16:37:18 +01:00
|
|
|
ostream &operator<<(ostream &os, const ReferencePoint &rp)
|
2008-04-11 10:11:29 +02:00
|
|
|
{
|
2010-01-04 16:37:18 +01:00
|
|
|
// Coordinates
|
2010-01-13 15:29:44 +01:00
|
|
|
os << (Point3D) rp << '\n' ;
|
2010-01-04 16:37:18 +01:00
|
|
|
|
2010-02-16 19:31:25 +01:00
|
|
|
// List of requests
|
2010-02-26 13:09:45 +01:00
|
|
|
if (rp.requests.empty())
|
2010-02-16 19:31:25 +01:00
|
|
|
os << "No request." << '\n' ;
|
2009-05-29 13:46:49 +02:00
|
|
|
else
|
2010-02-16 19:31:25 +01:00
|
|
|
for (vector<CalibrationRequest*>::const_iterator
|
|
|
|
i = rp.requests.begin() ;
|
|
|
|
i != rp.requests.end() ; ++i)
|
2010-06-02 12:38:17 +02:00
|
|
|
os << '\n' << **i ;
|
2008-04-11 10:11:29 +02:00
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
return os ;
|
2010-05-21 10:35:15 +02:00
|
|
|
}
|
2010-06-07 15:09:22 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This is a simple call to hash_value(Point3D), because we do not want
|
|
|
|
* to take care of the CalibrationRequest list to hash the
|
|
|
|
* ReferencePoint.
|
|
|
|
*/
|
|
|
|
size_t hash_value(const ReferencePoint &source)
|
|
|
|
{
|
|
|
|
return hash_value(static_cast<Point3D>(source)) ;
|
|
|
|
}
|