| [207] | 1 | // -*- c++ -*- | 
|---|
| [201] | 2 | #ifndef HUGO_XY_H | 
|---|
|  | 3 | #define HUGO_XY_H | 
|---|
|  | 4 |  | 
|---|
|  | 5 | #include <iostream> | 
|---|
|  | 6 |  | 
|---|
| [207] | 7 | namespace hugo { | 
|---|
| [201] | 8 |  | 
|---|
| [249] | 9 | ///\file | 
|---|
|  | 10 | ///\brief A simple two dimensional vector and a bounding box implementation | 
|---|
|  | 11 | /// | 
|---|
|  | 12 | /// The class \ref hugo::xy "xy" implements | 
|---|
|  | 13 | ///a two dimensional vector with the usual | 
|---|
|  | 14 | /// operations. | 
|---|
|  | 15 | /// | 
|---|
|  | 16 | /// The class \ref hugo::BoundingBox "BoundingBox" can be used to determine | 
|---|
|  | 17 | /// the rectangular bounding box a set of \ref hugo::xy "xy"'s. | 
|---|
|  | 18 |  | 
|---|
|  | 19 |  | 
|---|
| [242] | 20 | /** \brief | 
|---|
|  | 21 | 2 dimensional vector (plainvector) implementation | 
|---|
|  | 22 |  | 
|---|
|  | 23 | */ | 
|---|
| [207] | 24 | template<typename T> | 
|---|
|  | 25 | class xy { | 
|---|
| [201] | 26 |  | 
|---|
| [207] | 27 | public: | 
|---|
| [240] | 28 |  | 
|---|
|  | 29 | T x,y; | 
|---|
| [207] | 30 |  | 
|---|
|  | 31 | ///Default constructor: both coordinates become 0 | 
|---|
| [240] | 32 | xy() : x(0), y(0) {} | 
|---|
| [201] | 33 |  | 
|---|
| [240] | 34 | ///Constructing the instance from coordinates | 
|---|
|  | 35 | xy(T a, T b) : x(a), y(a) { } | 
|---|
| [201] | 36 |  | 
|---|
|  | 37 |  | 
|---|
| [207] | 38 | ///Gives back the square of the norm of the vector | 
|---|
|  | 39 | T normSquare(){ | 
|---|
| [240] | 40 | return x*x+y*y; | 
|---|
| [207] | 41 | }; | 
|---|
| [201] | 42 |  | 
|---|
| [207] | 43 | ///Increments the left hand side by u | 
|---|
|  | 44 | xy<T>& operator +=(const xy<T>& u){ | 
|---|
| [240] | 45 | x += u.x; | 
|---|
|  | 46 | y += u.y; | 
|---|
| [207] | 47 | return *this; | 
|---|
|  | 48 | }; | 
|---|
| [201] | 49 |  | 
|---|
| [207] | 50 | ///Decrements the left hand side by u | 
|---|
|  | 51 | xy<T>& operator -=(const xy<T>& u){ | 
|---|
| [240] | 52 | x -= u.x; | 
|---|
|  | 53 | y -= u.y; | 
|---|
| [207] | 54 | return *this; | 
|---|
|  | 55 | }; | 
|---|
| [201] | 56 |  | 
|---|
| [207] | 57 | ///Multiplying the left hand side with a scalar | 
|---|
|  | 58 | xy<T>& operator *=(const T &u){ | 
|---|
| [240] | 59 | x *= u; | 
|---|
|  | 60 | y *= u; | 
|---|
| [207] | 61 | return *this; | 
|---|
|  | 62 | }; | 
|---|
|  | 63 |  | 
|---|
|  | 64 | ///Dividing the left hand side by a scalar | 
|---|
|  | 65 | xy<T>& operator /=(const T &u){ | 
|---|
| [240] | 66 | x /= u; | 
|---|
|  | 67 | y /= u; | 
|---|
| [207] | 68 | return *this; | 
|---|
|  | 69 | }; | 
|---|
| [201] | 70 |  | 
|---|
| [207] | 71 | ///Returns the scalar product of two vectors | 
|---|
|  | 72 | T operator *(const xy<T>& u){ | 
|---|
| [240] | 73 | return x*u.x+y*u.y; | 
|---|
| [207] | 74 | }; | 
|---|
| [201] | 75 |  | 
|---|
| [207] | 76 | ///Returns the sum of two vectors | 
|---|
|  | 77 | xy<T> operator+(const xy<T> &u) const { | 
|---|
|  | 78 | xy<T> b=*this; | 
|---|
|  | 79 | return b+=u; | 
|---|
|  | 80 | }; | 
|---|
| [201] | 81 |  | 
|---|
| [207] | 82 | ///Returns the difference of two vectors | 
|---|
|  | 83 | xy<T> operator-(const xy<T> &u) const { | 
|---|
|  | 84 | xy<T> b=*this; | 
|---|
|  | 85 | return b-=u; | 
|---|
|  | 86 | }; | 
|---|
| [201] | 87 |  | 
|---|
| [207] | 88 | ///Returns a vector multiplied by a scalar | 
|---|
|  | 89 | xy<T> operator*(const T &u) const { | 
|---|
|  | 90 | xy<T> b=*this; | 
|---|
|  | 91 | return b*=u; | 
|---|
|  | 92 | }; | 
|---|
| [201] | 93 |  | 
|---|
| [207] | 94 | ///Returns a vector divided by a scalar | 
|---|
|  | 95 | xy<T> operator/(const T &u) const { | 
|---|
|  | 96 | xy<T> b=*this; | 
|---|
|  | 97 | return b/=u; | 
|---|
|  | 98 | }; | 
|---|
| [201] | 99 |  | 
|---|
| [207] | 100 | ///Testing equality | 
|---|
|  | 101 | bool operator==(const xy<T> &u){ | 
|---|
| [240] | 102 | return (x==u.x) && (y==u.y); | 
|---|
| [207] | 103 | }; | 
|---|
| [201] | 104 |  | 
|---|
| [207] | 105 | ///Testing inequality | 
|---|
|  | 106 | bool operator!=(xy u){ | 
|---|
| [240] | 107 | return  (x!=u.x) || (y!=u.y); | 
|---|
| [207] | 108 | }; | 
|---|
| [201] | 109 |  | 
|---|
| [207] | 110 | }; | 
|---|
| [201] | 111 |  | 
|---|
| [207] | 112 | ///Reading a plainvector from a stream | 
|---|
|  | 113 | template<typename T> | 
|---|
|  | 114 | inline | 
|---|
|  | 115 | std::istream& operator>>(std::istream &is, xy<T> &z) | 
|---|
|  | 116 | { | 
|---|
| [240] | 117 |  | 
|---|
|  | 118 | is >> z.x >> z.y; | 
|---|
| [207] | 119 | return is; | 
|---|
|  | 120 | } | 
|---|
| [201] | 121 |  | 
|---|
| [207] | 122 | ///Outputting a plainvector to a stream | 
|---|
|  | 123 | template<typename T> | 
|---|
|  | 124 | inline | 
|---|
|  | 125 | std::ostream& operator<<(std::ostream &os, xy<T> z) | 
|---|
|  | 126 | { | 
|---|
| [240] | 127 | os << "(" << z.x << ", " << z.y << ")"; | 
|---|
| [207] | 128 | return os; | 
|---|
|  | 129 | } | 
|---|
|  | 130 |  | 
|---|
| [244] | 131 |  | 
|---|
|  | 132 | /** \brief | 
|---|
|  | 133 | Implementation of a bounding box of plainvectors. | 
|---|
|  | 134 |  | 
|---|
|  | 135 | */ | 
|---|
|  | 136 | template<typename T> | 
|---|
|  | 137 | class BoundingBox { | 
|---|
|  | 138 | xy<T> bottom_left, top_right; | 
|---|
|  | 139 | bool _empty; | 
|---|
|  | 140 | public: | 
|---|
|  | 141 |  | 
|---|
|  | 142 | ///Default constructor: an empty bounding box | 
|---|
|  | 143 | BoundingBox() { _empty = true; } | 
|---|
|  | 144 |  | 
|---|
|  | 145 | ///Constructing the instance from one point | 
|---|
|  | 146 | BoundingBox(xy<T> a) { bottom_left=top_right=a; _empty = false; } | 
|---|
|  | 147 |  | 
|---|
|  | 148 | ///Is there any point added | 
|---|
|  | 149 | bool empty() const { | 
|---|
|  | 150 | return _empty; | 
|---|
|  | 151 | } | 
|---|
|  | 152 |  | 
|---|
|  | 153 | ///Gives back the bottom left corner (if the bounding box is empty, then the return value is not defined) | 
|---|
|  | 154 | xy<T> bottomLeft() const { | 
|---|
|  | 155 | return bottom_left; | 
|---|
|  | 156 | }; | 
|---|
|  | 157 |  | 
|---|
|  | 158 | ///Gives back the top right corner (if the bounding box is empty, then the return value is not defined) | 
|---|
|  | 159 | xy<T> topRight() const { | 
|---|
|  | 160 | return top_right; | 
|---|
|  | 161 | }; | 
|---|
|  | 162 |  | 
|---|
|  | 163 | ///Checks whether a point is inside a bounding box | 
|---|
|  | 164 | bool inside(const xy<T>& u){ | 
|---|
|  | 165 | if (_empty) | 
|---|
|  | 166 | return false; | 
|---|
|  | 167 | else{ | 
|---|
|  | 168 | return ((u.x-bottom_left.x)*(top_right.x-u.x) >= 0 && | 
|---|
|  | 169 | (u.y-bottom_left.y)*(top_right.y-u.y) >= 0 ); | 
|---|
|  | 170 | } | 
|---|
|  | 171 | } | 
|---|
|  | 172 |  | 
|---|
|  | 173 | ///Increments a bounding box with a point | 
|---|
|  | 174 | BoundingBox& operator +=(const xy<T>& u){ | 
|---|
|  | 175 | if (_empty){ | 
|---|
|  | 176 | bottom_left=top_right=u; | 
|---|
|  | 177 | _empty = false; | 
|---|
|  | 178 | } | 
|---|
|  | 179 | else{ | 
|---|
|  | 180 | if (bottom_left.x > u.x) bottom_left.x = u.x; | 
|---|
|  | 181 | if (bottom_left.y > u.y) bottom_left.y = u.y; | 
|---|
|  | 182 | if (top_right.x < u.x) top_right.x = u.x; | 
|---|
|  | 183 | if (top_right.y < u.y) top_right.y = u.y; | 
|---|
|  | 184 | } | 
|---|
|  | 185 | return *this; | 
|---|
|  | 186 | }; | 
|---|
|  | 187 |  | 
|---|
|  | 188 | ///Sums a bounding box and a point | 
|---|
|  | 189 | BoundingBox operator +(const xy<T>& u){ | 
|---|
|  | 190 | BoundingBox b = *this; | 
|---|
|  | 191 | return b += u; | 
|---|
|  | 192 | }; | 
|---|
|  | 193 |  | 
|---|
|  | 194 | ///Increments a bounding box with an other bounding box | 
|---|
|  | 195 | BoundingBox& operator +=(const BoundingBox &u){ | 
|---|
|  | 196 | if ( !u.empty() ){ | 
|---|
|  | 197 | *this += u.bottomLeft(); | 
|---|
|  | 198 | *this += u.topRight(); | 
|---|
|  | 199 | } | 
|---|
|  | 200 | return *this; | 
|---|
|  | 201 | }; | 
|---|
|  | 202 |  | 
|---|
|  | 203 | ///Sums two bounding boxes | 
|---|
|  | 204 | BoundingBox operator +(const BoundingBox& u){ | 
|---|
|  | 205 | BoundingBox b = *this; | 
|---|
|  | 206 | return b += u; | 
|---|
|  | 207 | }; | 
|---|
|  | 208 |  | 
|---|
|  | 209 | };//class Boundingbox | 
|---|
|  | 210 |  | 
|---|
|  | 211 |  | 
|---|
|  | 212 |  | 
|---|
|  | 213 |  | 
|---|
| [207] | 214 | } //namespace hugo | 
|---|
| [201] | 215 |  | 
|---|
|  | 216 | #endif //HUGO_XY_H | 
|---|