src/work/athos/xy/boundingbox.h
author athos
Tue, 23 Mar 2004 17:28:47 +0000
changeset 240 4a1d2e642552
child 242 b255f25ad394
permissions -rw-r--r--
Elk?sz?lt a boundingbox oszt?ly (boundingbox.h) ?s hozz? a tesztprogi.
     1 // -*- c++ -*-
     2 /**
     3 Implementation of a bounding box of plainvectors.
     4 
     5 */
     6 #ifndef HUGO_BOUNDINGBOX_H
     7 #define HUGO_BOUNDINGBOX_H
     8 
     9 
    10 #include <xy.h>
    11 
    12 namespace hugo {
    13 
    14   template<typename T>
    15     class BoundingBox {
    16       xy<T> bottomleft, topright;
    17       bool _empty;
    18     public:
    19       
    20       ///Default constructor: an empty bounding box
    21       BoundingBox() { _empty = true; }
    22 
    23       ///Constructing the instance from one point
    24       BoundingBox(xy<T> a) { bottomleft=topright=a; _empty = false; }
    25 
    26       ///Is there any point added
    27       bool empty() const {
    28 	return _empty;
    29       }
    30 
    31       ///Gives back the bottom left corner (if the bounding box is empty, then the return value is not defined) 
    32       xy<T> bottomLeft() const {
    33 	return bottomleft;
    34       };
    35 
    36       ///Gives back the top right corner (if the bounding box is empty, then the return value is not defined) 
    37       xy<T> topRight() const {
    38 	return topright;
    39       };
    40 
    41       ///Checks whether a point is inside a bounding box
    42       bool inside(const xy<T>& u){
    43 	if (_empty)
    44 	  return false;
    45 	else{
    46 	  return ((u.x-bottomleft.x)*(topright.x-u.x) >= 0 &&
    47 		  (u.y-bottomleft.y)*(topright.y-u.y) >= 0 );
    48 	}
    49       }
    50   
    51       ///Increments a bounding box with a point
    52       BoundingBox& operator +=(const xy<T>& u){
    53 	if (_empty){
    54 	  bottomleft=topright=u;
    55 	  _empty = false;
    56 	}
    57 	else{
    58 	  if (bottomleft.x > u.x) bottomleft.x = u.x;
    59 	  if (bottomleft.y > u.y) bottomleft.y = u.y;
    60 	  if (topright.x < u.x) topright.x = u.x;
    61 	  if (topright.y < u.y) topright.y = u.y;
    62 	}
    63 	return *this;
    64       };
    65   
    66       ///Sums a bounding box and a point
    67       BoundingBox operator +(const xy<T>& u){
    68 	BoundingBox b = *this;
    69 	return b += u;
    70       };
    71 
    72       ///Increments a bounding box with an other bounding box
    73       BoundingBox& operator +=(const BoundingBox &u){
    74 	if ( !u.empty() ){
    75 	  *this += u.bottomLeft();
    76 	  *this += u.topRight();
    77 	}
    78 	return *this;
    79       };
    80   
    81       ///Sums two bounding boxes
    82       BoundingBox operator +(const BoundingBox& u){
    83 	BoundingBox b = *this;
    84 	return b += u;
    85       };
    86 
    87     };//class BoundingBox
    88 
    89 
    90 } //namespace hugo
    91 
    92 #endif //HUGO_BOUNDINGBOX_H