owlps/owlps-positioning/area.cc

148 lines
2.7 KiB
C++
Raw Normal View History

#include "area.hh"
using namespace std ;
/* *** Constructors *** */
Area::Area(const Building *_building, const string &_name,
const float &_x1, const float &_y1, const float &_z1,
const float &_x2, const float &_y2, const float &_z2)
{
building = const_cast<Building*>(_building) ;
name = _name ;
float x_min, x_max, y_min, y_max, z_min, z_max ;
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
if (_x1 < _x2 && _y1 > _y2) // Le premier point de la pièce
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
{
// est en haut à gauche
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
x_min = _x1 ;
x_max = _x2 ;
y_min = _y2 ; // on inverse les Y
y_max = _y1 ;
}
else if (_x1 > _x2 && _y1 < _y2) // Le premier point de la pièce
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
{
// est en bas à droite
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
x_min = _x2 ; // on inverse les X
x_max = _x1 ;
y_min = _y1 ;
y_max = _y2 ;
}
else if (_x1 > _x2 && _z1 > _z2) // Le premier point de la pièce
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
{
// est en haut à droite
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
x_min = _x2 ; // on inverse les X
x_max = _x1 ;
z_min = _z2 ; // on inverse les Y
z_max = _z1 ;
}
else // Le premier point de la pièce est en bas à gauche
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
{
// ou autres cas (par ex. coordonnées nulles)
GuiNuMo : plein de modifs (gestion topologie) server.{hh,cc} : * Changé le comportement des fonctions pointIndex() et pointExists() : pointIndex() renvoie -1 si le point n'est pas trouvé, et pointExists() effectue un appel à pointIndex(). Passage de toutes ces fonctions en inline. * Déplacement des fonctions point_tab_idx() et point_vector_idx() dans la classe Server, en tant que variantes de pointIndex(). * Utilisation, pour les bibliothèques C, des en-têtes C++ (e.g <cmath>) plutôt que les en-têtes C (e.g <math.h>). * Correction des fonctions areaConnection() qui utilisaient la mauvaise liste de points. * Diverses corrections mineures. * Modification de la fonction makeWaypointListFromFile() afin de prendre en compte la topologie dans le calcul des distances. * Ajout de la fonction inTheSameArea(), qui permet de savoir si deux points appartiennent à la même zone. * Ajout de la fonction checkTopology() qui effectues quelques vérifications sur la topologie du bâtiment déclarée dans les fichiers de configuration. area.cc : * Modification du constructeur de manière à ce qu'il accepte tous les formats possibles de définitions des zones (4 ordres possibles pour les coordonnées). point.{hh,cc} : * Modification de l'operator< pour que la comparaison ne soit pas ambigüe (posait problème dans les set). * Modification des autres opérateurs, ajout des opérateurs <= et >=. cfg/ : * waypoints.csv : ajout des points de passage du rez-de-chaussée et des escaliers. * topo.csv : ajout des zones du rez-de-chaussée et des escaliers. Makefile : * Suppression d'options inutiles. * Suppression de l'option d'optimisation, qui causait une boucle infinie bizarre : cf. Server::makeWaypointListFromFile(). git-svn-id: https://pif.pu-pm.univ-fcomte.fr/svn/loc@48 785a6c6c-259e-4ff1-8b91-dc31627914f0
2008-07-03 15:04:30 +02:00
x_min = _x1 ;
x_max = _x2 ;
y_min = _y1 ;
y_max = _y2 ;
}
if (_z1 < _z2)
{
z_min = _z1 ;
z_max = _z2 ;
}
else
{
z_min = _z2 ;
z_max = _z1 ;
}
p_min = Point3D(x_min, y_min, z_min) ;
p_max = Point3D(x_max, y_max, z_max) ;
}
Area::Area(const Area &a)
{
building = a.building ;
name = a.name ;
p_min = a.p_min ;
p_max = a.p_max ;
}
/* *** Operations *** */
/**
* @return \em true if \em p is into the Area.
* @return \em false if \em p is not into the Area.
*/
bool Area::contains_point(const Point3D &p) const
{
return
p.get_x() >= p_min.get_x() &&
p.get_x() <= p_max.get_x() &&
p.get_y() >= p_min.get_y() &&
p.get_y() <= p_max.get_y() &&
p.get_z() >= p_min.get_z() &&
p.get_z() <= p_max.get_z() ;
}
/* *** Operators *** */
const Area& Area::operator=(const Area &a)
{
if (this == &a)
return *this ;
building = a.building ;
name = a.name ;
p_min = a.p_min ;
p_max = a.p_max ;
return *this ;
}
bool Area::operator==(const Area &a) const
{
if (this == &a)
return true ;
return
building == a.building &&
name == a.name &&
p_min == a.p_min &&
p_max == a.p_max ;
}
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
/**
* Note: to avoid looping, the Building associated with the Area is
* not displayed.
*/
ostream &operator<<(ostream &os, const Area &a)
{
os << a.name << ';'
<< a.p_min.get_x() << ';'
<< a.p_max.get_x() << ';'
<< a.p_min.get_y() << ';'
<< a.p_max.get_y() << ';'
<< a.p_min.get_z() << ';'
<< a.p_max.get_z() ;
return os ;
}