00001 #ifndef Rectangle_H
00002 #define Rectangle_H
00003
00023 #include <iostream>
00024 #include <Geometry.H>
00025 #include <Subspace.H>
00026
00039 class Rectangle : public RnSubspace {
00040
00045 friend
00046 std::ostream &operator<<(std::ostream &out, const Rectangle &rectangle) {
00047 out << rectangle.minBound() << '\n' << rectangle.maxBound();
00048 return out;}
00049
00050 public:
00053 explicit Rectangle(const int dimension)
00054 : RnSubspace(dimension),
00055 m_min_bound(dimension),
00056 m_max_bound(dimension) {}
00057
00061 Rectangle(const RnPoint min_bound,
00062 const RnPoint max_bound)
00063 : RnSubspace(min_bound.n()),
00064 m_min_bound(min_bound),
00065 m_max_bound(max_bound) {
00066 for(int i(0); i < this->n(); ++i)
00067 if(m_min_bound[i] > m_max_bound[i])
00068 m_max_bound[i] = m_min_bound[i];
00069 }
00070
00073 Rectangle(const Rectangle &rectangle)
00074 : RnSubspace(rectangle),
00075 m_min_bound(rectangle.minBound()),
00076 m_max_bound(rectangle.maxBound()) {}
00077
00079 virtual ~Rectangle() {}
00080
00084 Rectangle &operator=(const Rectangle &rectangle) {
00085 assert(rectangle.n() == this->n());
00086 RnSubspace::operator=(rectangle);
00087 m_min_bound = rectangle.minBound();
00088 m_max_bound = rectangle.maxBound();
00089 return *this;
00090 }
00091
00095 bool operator==(const Rectangle &rectangle) const {
00096 return (RnSubspace::operator==(rectangle)
00097 && (m_min_bound == rectangle.minBound())
00098 && (m_max_bound == rectangle.maxBound()));
00099 }
00100
00102
00103
00104 RnPoint &minBound() {return m_min_bound;}
00106 RnPoint &maxBound() {return m_max_bound;}
00107
00109 const RnPoint &minBound() const {return m_min_bound;}
00111 const RnPoint &maxBound() const {return m_max_bound;}
00112
00114 double volume() const {
00115 double v(1.0);
00116 for(int d(0); d < n(); ++d) v *= maxBound()[d] - minBound()[d];
00117 return v;}
00119
00123 bool valid() const {
00124 for(int i(0); i < this->n(); ++i)
00125 if(m_max_bound[i] < m_min_bound[i]) return false;
00126 return true;
00127 }
00128
00130
00131
00134 bool interior(const RnPoint &point) const {
00135 assert(this->n() == point.n());
00136 for(int i(0); i < this->n(); ++i)
00137 if((point[i] <= m_min_bound[i]) || (point[i] >= m_max_bound[i]))
00138 return false;
00139 return true;
00140 }
00141
00145 bool boundary(const RnPoint &point) const {
00146 assert(this->n() == point.n());
00147 bool frontier(false);
00148 for(int i(0); i < this->n(); ++i) {
00149 if((point[i] == m_min_bound[i]) || (point[i] == m_max_bound[i]))
00150 frontier = true;
00151 if((point[i] < m_min_bound[i]) || (point[i] > m_max_bound[i]))
00152 return false;
00153 }
00154 return frontier;
00155 }
00156
00160 bool closure(const RnPoint &point) const {
00161 assert(this->n() == point.n());
00162 for(int i(0); i < this->n(); ++i)
00163 if((point[i] < m_min_bound[i]) || (point[i] > m_max_bound[i]))
00164 return false;
00165 return true;
00166 }
00168
00173 virtual void drawGnuplot(std::ostream &out,
00174 const int di = 0,
00175 const int dj = 1) const {
00176 out << m_min_bound[di] << ' ' << m_min_bound[dj] << '\n'
00177 << m_min_bound[di] << ' ' << m_max_bound[dj] << '\n'
00178 << m_max_bound[di] << ' ' << m_max_bound[dj] << '\n'
00179 << m_max_bound[di] << ' ' << m_min_bound[dj] << '\n'
00180 << m_min_bound[di] << ' ' << m_min_bound[dj] << '\n';
00181 }
00182
00183 private:
00185 RnPoint m_min_bound;
00186
00188 RnPoint m_max_bound;
00189 };
00190
00191 #endif // Rectangle_H