politopix  4.1.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
HalfSpace_Rn.h
Go to the documentation of this file.
1 // politopix allows to make computations on polytopes such as finding vertices, intersecting, Minkowski sums, ...
2 // Copyright (C) 2011-2016 : Delos Vincent
3 //
4 // This program is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU Lesser General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // This program is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU Lesser General Public License for more details.
13 //
14 // You should have received a copy of the GNU Lesser General Public License
15 // along with this program. If not, see <http://www.gnu.org/licenses/>.
16 //
19 // I2M (UMR CNRS 5295 / University of Bordeaux)
20 
21 #ifndef HALFSPACE_Rn
22 #define HALFSPACE_Rn
23 
24 #include <numeric>
25 #include <stdexcept>
26 #include <exception>
27 #include <boost/shared_ptr.hpp>
28 #include <boost/numeric/ublas/vector.hpp>
29 #include <boost/numeric/ublas/io.hpp>
30 #include "Rn.h"
31 
32 using namespace boost::numeric::ublas;
33 
34 
38 
39  public:
40 
41  enum State {
42  hs_ON = 0,
43  hs_IN = 1,
44  hs_OUT = 2,
45  hs_UNKNOWN = 3,
46  hs_IN_OR_OUT = 4};
47 
49  HalfSpace_Rn(unsigned int n);
50 
51  ~HalfSpace_Rn();
52 
53  double getCoefficient(unsigned int i) const throw (std::out_of_range);
54 
55  void setCoefficient(unsigned int i, double c) throw (std::out_of_range);
56 
57  void setConstant(double c) {_constant = c;}
58 
59  double getConstant() const {return _constant;}
60 
61  void negate() {_coefficients *= -1.;}
62 
63  int dimension() const {return _coefficients.size();}
64 
65  std::string getSideAsText() const {return std::string(">=");}
66 
67  boost::numeric::ublas::vector<double>::const_iterator begin() const {return _coefficients.begin();}
68 
69  boost::numeric::ublas::vector<double>::const_iterator end() const {return _coefficients.end();}
70 
71  const boost::numeric::ublas::vector<double>& vect() const {return _coefficients;}
72 
73  static std::string getStateAsText(const HalfSpace_Rn::State&);
74 
75  double computeDistancePointHyperplane(const boost::numeric::ublas::vector<double>& thisPoint) const {
76  double halfSpaceNorm = std::inner_product(_coefficients.begin(), _coefficients.end(), _coefficients.begin(), 0.);
77  halfSpaceNorm = sqrt(halfSpaceNorm);
78  double scalarProduct = std::inner_product(thisPoint.begin(), thisPoint.end(), _coefficients.begin(), 0.);
79  double distanceToHyperplane = (scalarProduct+_constant) / halfSpaceNorm;
80  return distanceToHyperplane;
81  }
82 
83  double computeDistancePointHyperplane(const boost::numeric::ublas::vector<double>& thisPoint, double halfSpaceNorm) const {
84  double scalarProduct = std::inner_product(thisPoint.begin(), thisPoint.end(), _coefficients.begin(), 0.);
85  double distanceToHyperplane = (scalarProduct+_constant) / halfSpaceNorm;
86  return distanceToHyperplane;
87  }
88 
90  const boost::numeric::ublas::vector<double>& thisPoint,
91  boost::numeric::ublas::vector<double>& projectedPoint,
92  double halfSpaceNorm) const {
93  double scalarProduct = std::inner_product(thisPoint.begin(), thisPoint.end(), _coefficients.begin(), 0.);
94  double distanceToHyperplane = (scalarProduct+_constant) / halfSpaceNorm;
95  projectedPoint = thisPoint - distanceToHyperplane*_coefficients;
96  return distanceToHyperplane;
97  }
98 
99  void dump(std::ostream &this_ostream) const {
100  this_ostream << "(" << getConstant() << ", ";
101  unsigned int RnDIM = _coefficients.size();
102  {for (unsigned int ii=0; ii<RnDIM; ++ii) {
103  this_ostream << getCoefficient(ii);
104  if (ii != RnDIM-1)
105  this_ostream << ", ";
106  }}
107  this_ostream << ")";
108  }
109 
110  protected:
112  boost::numeric::ublas::vector<double> _coefficients;
114  double _constant;
115 
116 };
117 
118 #endif // HALFSPACE_Rn
double computeDistancePointHyperplane(const boost::numeric::ublas::vector< double > &thisPoint, double halfSpaceNorm) const
Definition: HalfSpace_Rn.h:83
void setConstant(double c)
Definition: HalfSpace_Rn.h:57
boost::numeric::ublas::vector< double >::const_iterator begin() const
Definition: HalfSpace_Rn.h:67
A half-space whose frontier is a linear (n-1) dimension space. _constant + _coefficients[0].x1 + ... + _coefficients[n-1].xn >= 0.
Definition: HalfSpace_Rn.h:37
boost::numeric::ublas::vector< double > _coefficients
The normal vector.
Definition: HalfSpace_Rn.h:112
int dimension() const
Definition: HalfSpace_Rn.h:63
double computeDistancePointHyperplane(const boost::numeric::ublas::vector< double > &thisPoint, boost::numeric::ublas::vector< double > &projectedPoint, double halfSpaceNorm) const
Definition: HalfSpace_Rn.h:89
#define polito_EXPORT
Definition: polito_Export.h:15
void dump(std::ostream &this_ostream) const
Definition: HalfSpace_Rn.h:99
double _constant
The second member constant.
Definition: HalfSpace_Rn.h:114
void negate()
Definition: HalfSpace_Rn.h:61
double computeDistancePointHyperplane(const boost::numeric::ublas::vector< double > &thisPoint) const
Definition: HalfSpace_Rn.h:75
double getConstant() const
Definition: HalfSpace_Rn.h:59
const boost::numeric::ublas::vector< double > & vect() const
Definition: HalfSpace_Rn.h:71
std::string getSideAsText() const
Definition: HalfSpace_Rn.h:65
boost::numeric::ublas::vector< double >::const_iterator end() const
Definition: HalfSpace_Rn.h:69