owlps/owlps-positioner/area.cc

181 lines
3.6 KiB
C++

/*
* This file is part of the Owl Positioning System (OwlPS) project.
* It is subject to the copyright notice and license terms in the
* COPYRIGHT.t2t file found in the top-level directory of this
* distribution and at
* https://code.lm7.fr/mcy/owlps/src/master/COPYRIGHT.t2t
* No part of the OwlPS Project, including this file, may be copied,
* modified, propagated, or distributed except according to the terms
* contained in the COPYRIGHT.t2t file; the COPYRIGHT.t2t file must be
* distributed along with this file, either separately or by replacing
* this notice by the COPYRIGHT.t2t file's contents.
*/
#include "area.hh"
#include "building.hh"
using namespace std ;
/* *** Constructors *** */
Area::Area(const Building *const _building, const string &_name,
const Point3D &p1, const Point3D &p2):
building(_building), name(_name)
{
set_coordinates(p1, p2) ;
}
/* *** Operations *** */
/**
* @returns `true` if `p` is into the Area.
* @returns `false` if `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() ;
}
/**
* Changes the Area coordinates so that #p_min is the South-West-lower
* point and #p_max the North-East-higher point.
*/
void Area::reorder_coordinates()
{
float
x1 = p_min.get_x(),
y1 = p_min.get_y(),
z1 = p_min.get_z(),
x2 = p_max.get_x(),
y2 = p_max.get_y(),
z2 = p_max.get_z(),
x_min, x_max, y_min,
y_max, z_min, z_max ;
// 2-D coordinates (X and Y) //
// First point is North-West
if (x1 < x2 && y1 > y2)
{
x_min = x1 ;
x_max = x2 ;
y_min = y2 ; // We swap the two Y
y_max = y1 ;
}
// First point is South-East
else if (x1 > x2 && y1 < y2)
{
x_min = x2 ; // We swap the two X
x_max = x1 ;
y_min = y1 ;
y_max = y2 ;
}
// First point is North-East
else if (x1 > x2 && y1 > y2)
{
x_min = x2 ; // We swap the two X
x_max = x1 ;
y_min = y2 ; // and we swap the two Y
y_max = y1 ;
}
// First point is South-West
// (or other cases such as coordinates equal to zero)
else
{
// We swap nothing
x_min = x1 ;
x_max = x2 ;
y_min = y1 ;
y_max = y2 ;
}
// Vertical coordinate (Z) //
// First point is lower
if (z1 < z2)
{
z_min = z1 ;
z_max = z2 ;
}
// First point is higher
else
{
// We swap the two Z
z_min = z2 ;
z_max = z1 ;
}
p_min = Point3D(x_min, y_min, z_min) ;
p_max = Point3D(x_max, y_max, z_max) ;
}
/* *** Operators *** */
Area& Area::operator=(const Area &source)
{
if (this == &source)
return *this ;
building = source.building ;
name = source.name ;
p_min = source.p_min ;
p_max = source.p_max ;
return *this ;
}
bool Area::operator==(const Area &source) const
{
if (this == &source)
return true ;
return
building == source.building &&
name == source.name &&
p_min == source.p_min &&
p_max == source.p_max ;
}
/**
* Note: to avoid looping, the Building associated with the Area is
* not displayed.
*/
ostream &operator<<(ostream &os, const Area &a)
{
os
<< (a.building ? a.building->get_name() : "No building") << ';'
<< 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 ;
}