2008-04-11 10:11:29 +02:00
|
|
|
#include "area.hh"
|
|
|
|
|
|
|
|
|
2008-05-29 10:48:05 +02:00
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
/*** Constructeurs ***/
|
|
|
|
|
|
|
|
|
|
|
|
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)
|
2008-04-11 10:11:29 +02:00
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
building = (Building *) &_building ;
|
|
|
|
name = _name ;
|
|
|
|
|
|
|
|
float x_min, x_max, y_min, y_max, z_min, z_max ;
|
2008-07-03 15:04:30 +02:00
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
if (_x1 < _x2 && _y1 > _y2) // Le premier point de la pièce
|
2008-07-03 15:04:30 +02:00
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
// est en haut à gauche
|
2008-07-03 15:04:30 +02:00
|
|
|
x_min = _x1 ;
|
|
|
|
x_max = _x2 ;
|
|
|
|
y_min = _y2 ; // on inverse les Y
|
|
|
|
y_max = _y1 ;
|
|
|
|
}
|
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
else if (_x1 > _x2 && _y1 < _y2) // Le premier point de la pièce
|
2008-07-03 15:04:30 +02:00
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
// est en bas à droite
|
2008-07-03 15:04:30 +02:00
|
|
|
x_min = _x2 ; // on inverse les X
|
|
|
|
x_max = _x1 ;
|
|
|
|
y_min = _y1 ;
|
|
|
|
y_max = _y2 ;
|
|
|
|
}
|
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
else if (_x1 > _x2 && _z1 > _z2) // Le premier point de la pièce
|
2008-07-03 15:04:30 +02:00
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
// est en haut à droite
|
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 ;
|
|
|
|
}
|
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
else // Le premier point de la pièce est en bas à gauche
|
2008-07-03 15:04:30 +02:00
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
// ou autres cas (par ex. coordonnées nulles)
|
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 ;
|
|
|
|
}
|
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
p_min = Point3D(x_min, y_min, z_min) ;
|
|
|
|
p_max = Point3D(x_max, y_max, z_max) ;
|
|
|
|
|
2008-07-03 15:04:30 +02:00
|
|
|
#ifdef DEBUG_2
|
2009-12-07 16:03:53 +01:00
|
|
|
cout << "Area created : "<< area_name << p_min << "," << p_max << endl ;
|
2008-07-03 15:04:30 +02:00
|
|
|
#endif // DEBUG_2
|
2008-04-11 10:11:29 +02:00
|
|
|
}
|
|
|
|
|
2008-05-29 10:48:05 +02:00
|
|
|
|
2008-04-11 10:11:29 +02:00
|
|
|
Area::Area(const Area &a)
|
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
building = a.building ;
|
|
|
|
name = a.name ;
|
|
|
|
p_min = a.p_min ;
|
|
|
|
p_max = a.p_max ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*** Accesseurs lecture ***/
|
|
|
|
|
|
|
|
|
|
|
|
Building* Area::get_building(void) const
|
|
|
|
{
|
|
|
|
return building ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
string Area::get_name() const
|
|
|
|
{
|
|
|
|
return name ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Point3D Area::get_p_min() const
|
|
|
|
{
|
|
|
|
return p_min ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Point3D Area::get_p_max() const
|
|
|
|
{
|
|
|
|
return p_max ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*** Accesseurs écriture ***/
|
|
|
|
|
|
|
|
|
|
|
|
void Area::set_building(const Building &_building)
|
|
|
|
{
|
|
|
|
building = (Building *) &_building ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Area::set_name(const string &_name)
|
|
|
|
{
|
|
|
|
name = _name ;
|
2008-04-11 10:11:29 +02:00
|
|
|
}
|
|
|
|
|
2008-05-29 10:48:05 +02:00
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
void Area::set_x_min(const float &v)
|
|
|
|
{
|
|
|
|
p_min.set_x(v) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Area::set_y_min(const float &v)
|
|
|
|
{
|
|
|
|
p_min.set_y(v) ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Area::set_z_min(const float &v)
|
|
|
|
{
|
|
|
|
p_min.set_z(v) ;
|
|
|
|
}
|
|
|
|
|
2008-05-29 10:48:05 +02:00
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
void Area::set_x_max(const float &v)
|
2010-05-21 10:35:15 +02:00
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
p_max.set_x(v) ;
|
|
|
|
}
|
2010-05-21 10:35:15 +02:00
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
|
|
|
|
void Area::set_y_max(const float &v)
|
|
|
|
{
|
|
|
|
p_max.set_y(v) ;
|
2010-05-21 10:35:15 +02:00
|
|
|
}
|
2008-05-29 10:48:05 +02:00
|
|
|
|
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
void Area::set_z_max(const float &v)
|
|
|
|
{
|
|
|
|
p_max.set_z(v) ;
|
|
|
|
}
|
2008-05-29 10:48:05 +02:00
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
|
|
|
|
void Area::set_p_min(const Point3D &p)
|
2010-05-21 10:35:15 +02:00
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
p_min = p ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void Area::set_p_max(const Point3D &p)
|
|
|
|
{
|
|
|
|
p_max = p ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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() ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool Area::operator==(const Area &a) const
|
|
|
|
{
|
|
|
|
if (this == &a)
|
2010-05-21 10:35:15 +02:00
|
|
|
return true ;
|
|
|
|
|
2009-12-07 16:03:53 +01:00
|
|
|
return
|
|
|
|
building == a.building &&
|
|
|
|
name == a.name &&
|
|
|
|
p_min == a.p_min &&
|
|
|
|
p_max == a.p_max ;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool Area::operator!=(const Area &a) const
|
|
|
|
{
|
|
|
|
return !(*this == a) ;
|
2010-05-21 10:35:15 +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
|
|
|
|
|
|
|
|
|
|
|
|
2008-05-29 10:48:05 +02:00
|
|
|
ostream &operator<<(ostream &os, const Area &a)
|
|
|
|
{
|
2009-12-07 16:03:53 +01:00
|
|
|
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() ;
|
2008-05-29 10:48:05 +02:00
|
|
|
return os ;
|
|
|
|
}
|