COIN-OR::LEMON - Graph Library

source: lemon-0.x/src/lemon/xy.h @ 1083:8043b93e5973

Last change on this file since 1083:8043b93e5973 was 1083:8043b93e5973, checked in by Alpar Juttner, 19 years ago

Doc improvements

File size: 7.0 KB
RevLine 
[906]1/* -*- C++ -*-
[921]2 * src/lemon/xy.h - Part of LEMON, a generic C++ optimization library
[906]3 *
4 * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
5 * (Egervary Combinatorial Optimization Research Group, EGRES).
6 *
7 * Permission to use, modify and distribute this software is granted
8 * provided that this copyright notice appears in all copies. For
9 * precise terms see the accompanying LICENSE file.
10 *
11 * This software is provided "AS IS" with no warranty of any kind,
12 * express or implied, and with no claim as to its suitability for any
13 * purpose.
14 *
15 */
16
[921]17#ifndef LEMON_XY_H
18#define LEMON_XY_H
[201]19
20#include <iostream>
21
[491]22///\ingroup misc
[249]23///\file
24///\brief A simple two dimensional vector and a bounding box implementation
25///
[921]26/// The class \ref lemon::xy "xy" implements
[249]27///a two dimensional vector with the usual
28/// operations.
29///
[921]30/// The class \ref lemon::BoundingBox "BoundingBox" can be used to determine
31/// the rectangular bounding box a set of \ref lemon::xy "xy"'s.
[458]32///
33///\author Attila Bernath
[249]34
35
[921]36namespace lemon {
[431]37
38  /// \addtogroup misc
39  /// @{
40
[458]41  /// A two dimensional vector (plainvector) implementation
[242]42
[458]43  /// A two dimensional vector (plainvector) implementation
44  ///with the usual vector
45  /// operators.
46  ///
47  ///\author Attila Bernath
[207]48  template<typename T>
49    class xy {
[201]50
[207]51    public:
[240]52
[987]53      typedef T Value;
[964]54
[240]55      T x,y;     
[207]56     
57      ///Default constructor: both coordinates become 0
[240]58      xy() : x(0), y(0) {}
[201]59
[240]60      ///Constructing the instance from coordinates
[514]61      xy(T a, T b) : x(a), y(b) { }
[201]62
63
[1049]64      ///Conversion constructor
65      template<class TT> xy(const xy<TT> &p) : x(p.x), y(p.y) {}
66
[207]67      ///Gives back the square of the norm of the vector
68      T normSquare(){
[240]69        return x*x+y*y;
[207]70      };
[201]71 
[207]72      ///Increments the left hand side by u
73      xy<T>& operator +=(const xy<T>& u){
[240]74        x += u.x;
75        y += u.y;
[207]76        return *this;
77      };
[201]78 
[207]79      ///Decrements the left hand side by u
80      xy<T>& operator -=(const xy<T>& u){
[240]81        x -= u.x;
82        y -= u.y;
[207]83        return *this;
84      };
[201]85
[207]86      ///Multiplying the left hand side with a scalar
87      xy<T>& operator *=(const T &u){
[240]88        x *= u;
89        y *= u;
[207]90        return *this;
91      };
92
93      ///Dividing the left hand side by a scalar
94      xy<T>& operator /=(const T &u){
[240]95        x /= u;
96        y /= u;
[207]97        return *this;
98      };
[201]99 
[207]100      ///Returns the scalar product of two vectors
101      T operator *(const xy<T>& u){
[240]102        return x*u.x+y*u.y;
[207]103      };
[201]104 
[207]105      ///Returns the sum of two vectors
106      xy<T> operator+(const xy<T> &u) const {
107        xy<T> b=*this;
108        return b+=u;
109      };
[201]110
[1049]111      ///Returns the neg of the vectors
112      xy<T> operator-() const {
113        xy<T> b=*this;
114        b.x=-b.x; b.y=-b.y;
115        return b;
116      };
117
[207]118      ///Returns the difference of two vectors
119      xy<T> operator-(const xy<T> &u) const {
120        xy<T> b=*this;
121        return b-=u;
122      };
[201]123
[207]124      ///Returns a vector multiplied by a scalar
125      xy<T> operator*(const T &u) const {
126        xy<T> b=*this;
127        return b*=u;
128      };
[201]129
[207]130      ///Returns a vector divided by a scalar
131      xy<T> operator/(const T &u) const {
132        xy<T> b=*this;
133        return b/=u;
134      };
[201]135
[207]136      ///Testing equality
137      bool operator==(const xy<T> &u){
[240]138        return (x==u.x) && (y==u.y);
[207]139      };
[201]140
[207]141      ///Testing inequality
142      bool operator!=(xy u){
[240]143        return  (x!=u.x) || (y!=u.y);
[207]144      };
[201]145
[207]146    };
[201]147
[1071]148  ///Returns a vector multiplied by a scalar
[1083]149
150  ///Returns a vector multiplied by a scalar
151  ///\relates xy
[1071]152  template<typename T> xy<T> operator*(const T &u,const xy<T> &x) {
153    return x*u;
154  };
155
[814]156  ///Read a plainvector from a stream
157
[967]158  ///Read a plainvector from a stream
[814]159  ///\relates xy
160  ///
[207]161  template<typename T>
162  inline
163  std::istream& operator>>(std::istream &is, xy<T> &z)
164  {
[240]165
166    is >> z.x >> z.y;
[207]167    return is;
168  }
[201]169
[814]170  ///Write a plainvector to a stream
171
[967]172  ///Write a plainvector to a stream
[814]173  ///\relates xy
174  ///
[207]175  template<typename T>
176  inline
177  std::ostream& operator<<(std::ostream &os, xy<T> z)
178  {
[240]179    os << "(" << z.x << ", " << z.y << ")";
[207]180    return os;
181  }
182
[244]183
[458]184  /// A class to calculate or store the bounding box of plainvectors.
185
186  /// A class to calculate or store the bounding box of plainvectors.
187  ///
188  ///\author Attila Bernath
[244]189  template<typename T>
190    class BoundingBox {
191      xy<T> bottom_left, top_right;
192      bool _empty;
193    public:
194     
195      ///Default constructor: an empty bounding box
196      BoundingBox() { _empty = true; }
197
198      ///Constructing the instance from one point
199      BoundingBox(xy<T> a) { bottom_left=top_right=a; _empty = false; }
200
201      ///Is there any point added
202      bool empty() const {
203        return _empty;
204      }
205
206      ///Gives back the bottom left corner (if the bounding box is empty, then the return value is not defined)
207      xy<T> bottomLeft() const {
208        return bottom_left;
209      };
210
211      ///Gives back the top right corner (if the bounding box is empty, then the return value is not defined)
212      xy<T> topRight() const {
213        return top_right;
214      };
215
[1045]216      ///Gives back the bottom right corner (if the bounding box is empty, then the return value is not defined)
217      xy<T> bottomRight() const {
218        return xy<T>(top_right.x,bottom_left.y);
219      };
220
221      ///Gives back the top left corner (if the bounding box is empty, then the return value is not defined)
222      xy<T> topLeft() const {
223        return xy<T>(bottom_left.x,top_right.y);
224      };
225
226      ///Gives back the bottom of the box (if the bounding box is empty, then the return value is not defined)
227      T bottom() const {
228        return bottom_left.y;
229      };
230
231      ///Gives back the top of the box (if the bounding box is empty, then the return value is not defined)
232      T top() const {
233        return top_right.y;
234      };
235
236      ///Gives back the left side of the box (if the bounding box is empty, then the return value is not defined)
237      T left() const {
238        return bottom_left.x;
239      };
240
241      ///Gives back the right side of the box (if the bounding box is empty, then the return value is not defined)
242      T right() const {
243        return top_right.x;
244      };
245
[244]246      ///Checks whether a point is inside a bounding box
247      bool inside(const xy<T>& u){
248        if (_empty)
249          return false;
250        else{
251          return ((u.x-bottom_left.x)*(top_right.x-u.x) >= 0 &&
252                  (u.y-bottom_left.y)*(top_right.y-u.y) >= 0 );
253        }
254      }
255 
256      ///Increments a bounding box with a point
257      BoundingBox& operator +=(const xy<T>& u){
258        if (_empty){
259          bottom_left=top_right=u;
260          _empty = false;
261        }
262        else{
263          if (bottom_left.x > u.x) bottom_left.x = u.x;
264          if (bottom_left.y > u.y) bottom_left.y = u.y;
265          if (top_right.x < u.x) top_right.x = u.x;
266          if (top_right.y < u.y) top_right.y = u.y;
267        }
268        return *this;
269      };
270 
271      ///Sums a bounding box and a point
272      BoundingBox operator +(const xy<T>& u){
273        BoundingBox b = *this;
274        return b += u;
275      };
276
277      ///Increments a bounding box with an other bounding box
278      BoundingBox& operator +=(const BoundingBox &u){
279        if ( !u.empty() ){
280          *this += u.bottomLeft();
281          *this += u.topRight();
282        }
283        return *this;
284      };
285 
286      ///Sums two bounding boxes
287      BoundingBox operator +(const BoundingBox& u){
288        BoundingBox b = *this;
289        return b += u;
290      };
291
292    };//class Boundingbox
293
294
[431]295  /// @}
[244]296
297
[921]298} //namespace lemon
[201]299
[921]300#endif //LEMON_XY_H
Note: See TracBrowser for help on using the repository browser.