CS 596 OODP
Rectangle Class
[To Lecture Notes Index]
San Diego State University -- This page last updated Oct. 10, 1995

class Rectangle {
public:
Rectangle( const Point& UpperLeftCorner,
const Point& LowerLeftCorner );
void print ( ostream& output ) const;
Point getUpperLeftCorner() const;
Point getUpperRightCorner() const;
Point getLowerLeftCorner() const;
Point getLowerRightCorner() const;
Point* getCorners() const;
int contains( const Point& a ) const;
int intersects( const Rectangle a ) const;
private:
Point UpperLeft;
int width;
int height;
int containsCornerOf( const Rectangle a ) const;
};
Rectangle :: Rectangle( const Point& UpperLeftCorner,
const Point& LowerLeftCorner ) {
UpperLeft = UpperLeftCorner;
width = LowerLeftCorner.x() - UpperLeftCorner.x();
height = LowerLeftCorner.y() - UpperLeftCorner.y();
}
void Rectangle :: print ( ostream& output ) const {
Point* Corners = getCorners();
output << '[';
for (int K = 0; K < 4; K++ )
Corners[ K ].print( output );
output << "]";
}
Point Rectangle :: getUpperLeftCorner() const {
return UpperLeft;
}
Point Rectangle :: getUpperRightCorner() const {
Point UpperRightCorner( UpperLeft.x() + width, UpperLeft.y() );
return UpperRightCorner;
}
Point Rectangle :: getLowerLeftCorner() const {
Point LowerLeftCorner( UpperLeft.x() , UpperLeft.y() + height );
return LowerLeftCorner;
}
Point Rectangle :: getLowerRightCorner() const {
Point LowerRightCorner( UpperLeft.x() + width ,
UpperLeft.y() + height );
return LowerRightCorner;
}
Point* Rectangle :: getCorners() const{
Point* corners = new Point[4];
// Store in clockwise direction from UpperLeftCorner
corners[0] = getUpperLeftCorner();
corners[1] = getUpperRightCorner();
corners[2] = getLowerRightCorner();
corners[3] = getLowerLeftCorner();
return corners;
}
int Rectangle :: contains( const Point& a ) const {
if ( ( getUpperLeftCorner() <= a ) &&
( a <= getLowerRightCorner() )
)
return TRUE;
else
return FALSE;
};
int Rectangle :: containsCornerOf( const Rectangle a ) const {
Point* CornersOfA = a.getCorners();
int ContainsCorner = FALSE;
for (int K = 0; K < 4; K++ )
if ( contains( CornersOfA[ K ] ) == TRUE )
ContainsCorner = TRUE;
delete CornersOfA;
return ContainsCorner;
}
int Rectangle :: intersects( const Rectangle a ) const {
if ( containsCornerOf( a ) == TRUE )
return TRUE;
if ( a.containsCornerOf( *this ) == TRUE )
return TRUE;
// the case -------
// | |
// --------------
// | | | |
// --------------
// | |
// -------
Line aTop( a.getUpperLeftCorner() , a.getUpperRightCorner() );
Line aSide( a.getUpperLeftCorner() , a.getLowerLeftCorner() );
Line thisTop( this->getUpperLeftCorner() ,
this->getUpperRightCorner() );
Line thisSide( this->getUpperLeftCorner() ,
this->getLowerLeftCorner() );
if ( aTop.intersects( thisSide ) == TRUE )
return TRUE;
if ( thisTop.intersects( aSide ) == TRUE )
return TRUE;
return FALSE;
};