#ifndef _SIMP_FRUS_H
#define _SIMP_FRUS_H



class Frustum {
  friend ostream& operator<<(ostream&, const Frustum&);
  friend int operator==(const Frustum&, const Frustum&);
  friend int operator!=(const Frustum&, const Frustum&);
public:

  Frustum (void) {_x1 = _y1 = _x2 = _y2 = 0;}
  Frustum (int x1, int y1, int x2, int y2) : _x1 (x1), _y1 (y1), _x2 (x2), _y2 (y2) {}
  Frustum (const Frustum &f) : _x1 (f._x1), _y1 (f._y1), _x2 (f._x2), _y2 (f._y2) {}

  int X_left() const { return _x1; }
  int Y_bottom() const{ return _y1; }
  int X_right() const{ return _x2; }
  int Y_top() const { return _y2; }

  int Area (void) const {return XSize() * YSize();}
  int XSize (void) const {return _x2 - _x1 + 1;}
  int YSize (void) const{return _y2 - _y1 + 1;}

  void Set (int x1, int y1, int x2, int y2) {_x1 = x1; _y1 = y1; _x2 = x2; _y2 = y2;}
  int _x1, _y1;
  int _x2, _y2;

  int HalfX (void)const {return (_x1 + _x2) / 2;}
  int HalfY (void)const {return (_y1 + _y2) / 2;}

  int HasCorner (int x, int y) {
    if ( (x == _x1 || x == _x2) &&
         (y == _y1 || y == _y2)) return 1;
    return 0;
  }

  void Subdivide(Frustum &F00, Frustum &F10, Frustum &F01, Frustum &F11) const {

	int half_x = (_x1 + _x2) / 2;
	int half_y = (_y1 + _y2) / 2;

	F00._x1 = F01._x1 = _x1;
	F10._x2 = F11._x2 = _x2;
	F00._y1 = F10._y1 = _y1;
	F01._y2 = F11._y2 = _y2;

	F00._x2 = F01._x2 = F10._x1 = F11._x1 = half_x;
	F00._y2 = F10._y2 = F01._y1 = F11._y1 = half_y;
  }

};


#endif
