// frect.cpp // class FRect #include "frect.h" //---------------------------------------------------------------------- // class FRect //---------------------------------------------------------------------- // constructor and destructor //---------------------------------------------------------------------- FRect::FRect (const FPoint& p1, const FPoint& p2) { X1 = short(p1.getX()); Y1 = short(p1.getY()); X2 = short(p2.getX()); Y2 = short(p2.getY()); } //---------------------------------------------------------------------- FRect::~FRect() // destructor { } // public methods of FRect //---------------------------------------------------------------------- bool FRect::isNull() const { return X2 == X1-1 && Y2 == Y1-1; } //---------------------------------------------------------------------- void FRect::setX1 (int n) { X1 = short(n); } //---------------------------------------------------------------------- void FRect::setY1 (int n) { Y1 = short(n); } //---------------------------------------------------------------------- void FRect::setX2 (int n) { X2 = short(n); } //---------------------------------------------------------------------- void FRect::setY2 (int n) { Y2 = short(n); } //---------------------------------------------------------------------- void FRect::setX (int n) { short dX = X2 - X1; X1 = short(n); X2 = short(X1 + dX); } //---------------------------------------------------------------------- void FRect::setY (int n) { short dY = Y2 - Y1; Y1 = short(n); Y2 = short(Y1 + dY); } //---------------------------------------------------------------------- void FRect::setWidth (int w) { X2 = short(X1 + w - 1); } //---------------------------------------------------------------------- void FRect::setHeight (int h) { Y2 = short(Y1 + h - 1); } //---------------------------------------------------------------------- void FRect::setRect (const FRect& r) { setRect (r.X1, r.Y1, r.X2-r.X1+1, r.Y2-r.Y1+1); } //---------------------------------------------------------------------- void FRect::setRect (int x, int y, int width, int height) { X1 = short(x); Y1 = short(y); X2 = short(x+width-1); Y2 = short(y+height-1); } //---------------------------------------------------------------------- void FRect::move (int dx, int dy) { X1 += short(dx); Y1 += short(dy); X2 += short(dx); Y2 += short(dy); } //---------------------------------------------------------------------- void FRect::move (const FPoint& d) { X1 += short(d.getX()); Y1 += short(d.getY()); X2 += short(d.getX()); Y2 += short(d.getY()); } //---------------------------------------------------------------------- bool FRect::contains (int x, int y) const { return x >= X1 && x <= X2 && y >= Y1 && y <= Y2; } //---------------------------------------------------------------------- bool FRect::contains (const FPoint& p) const { return p.getX() >= X1 && p.getX() <= X2 && p.getY() >= Y1 && p.getY() <= Y2; } //---------------------------------------------------------------------- bool FRect::contains (const FRect& r) const { return r.X1 >= X1 && r.X2 <= X2 && r.Y1 >= Y1 && r.Y2 <= Y2; } //---------------------------------------------------------------------- bool FRect::overlap (const FRect &r) const { return ( std::max(X1, r.X1) <= std::min(X2, r.X2) && std::max(Y1, r.Y1) <= std::min(Y2, r.Y2) ); } //---------------------------------------------------------------------- FRect FRect::intersect (const FRect& r) const { // intersection: this ∩ r FRect new_rect; new_rect.X1 = std::max(X1, r.X1); new_rect.Y1 = std::max(Y1, r.Y1); new_rect.X2 = std::min(X2, r.X2); new_rect.Y2 = std::min(Y2, r.Y2); return new_rect; } //---------------------------------------------------------------------- FRect operator + (const FRect& r, const FPoint& p) { return FRect( r.X1, r.Y1, r.X2 - r.X1 + 1 + p.getX(), r.Y2 - r.Y1 + 1 + p.getY() ); } //---------------------------------------------------------------------- FRect operator - (const FRect& r, const FPoint& p) { return FRect( r.X1, r.Y1, r.X2 - r.X1 + 1 - p.getX(), r.Y2 - r.Y1 + 1 - p.getY() ); } //---------------------------------------------------------------------- bool operator == (const FRect& r1, const FRect& r2) { return r1.X1 == r2.X1 && r1.Y1 == r2.Y1 && r1.X2 == r2.X2 && r1.Y2 == r2.Y2; } //---------------------------------------------------------------------- bool operator != (const FRect& r1, const FRect& r2) { return r1.X1 != r2.X1 || r1.Y1 != r2.Y1 || r1.X2 != r2.X2 || r1.Y2 != r2.Y2; }