Index   Main   Namespaces   Classes   Hierarchy   Annotated   Files   Compound   Global   Pages  

SgRect.cpp

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------
00002 /** @file SgRect.cpp
00003     See SgRect.h */
00004 //----------------------------------------------------------------------------
00005 
00006 #include "SgSystem.h"
00007 #include "SgRect.h"
00008 
00009 #include <iostream>
00010 #include <limits>
00011 
00012 using namespace std;
00013 
00014 //----------------------------------------------------------------------------
00015 
00016 SgRect::SgRect()
00017     : m_left(numeric_limits<int>::max()),
00018       m_right(numeric_limits<int>::min()),
00019       m_top(numeric_limits<int>::max()),
00020       m_bottom(numeric_limits<int>::min())
00021 { }
00022 
00023 std::ostream& operator<<(std::ostream& stream, const SgRect& rect)
00024 {
00025     stream << "((" <<  rect.Left()  << ',' << rect.Top()  << "),"
00026            << '(' <<   rect.Right() << ',' << rect.Bottom() << "))";
00027     return stream;
00028 }
00029 
00030 void SgRect::Include(SgPoint p)
00031 {
00032     int x = SgPointUtil::Col(p);
00033     int y = SgPointUtil::Row(p);
00034     if (x < m_left)
00035         m_left = x;
00036     if (x > m_right)
00037         m_right = x;
00038     if (y < m_top)
00039         m_top = y;
00040     if (y > m_bottom)
00041         m_bottom = y;
00042 }
00043 
00044 void SgRect::Include(const SgRect& rect)
00045 {
00046     if (rect.m_left < m_left)
00047         m_left = rect.m_left;
00048     if (rect.m_right > m_right)
00049         m_right = rect.m_right;
00050     if (rect.m_top < m_top)
00051         m_top = rect.m_top;
00052     if (rect.m_bottom > m_bottom)
00053         m_bottom = rect.m_bottom;
00054 }
00055 
00056 void SgRect::Intersect(const SgRect& rect)
00057 {
00058     m_left = max(m_left, rect.m_left);
00059     m_right = min(m_right, rect.m_right);
00060     m_top = max(m_top, rect.m_top);
00061     m_bottom = min(m_bottom, rect.m_bottom);
00062 }
00063 
00064 SgPoint SgRect::Center() const
00065 {
00066     SG_ASSERT(! IsEmpty());
00067     return SgPointUtil::Pt((m_left + m_right) / 2, (m_top + m_bottom) / 2);
00068 }
00069 
00070 bool SgRect::InRect(SgPoint p) const
00071 {
00072     //AR: if (BorderSet[p]) return false;
00073     int x = SgPointUtil::Col(p);
00074     int y = SgPointUtil::Row(p);
00075     return (x >= m_left) && (x <= m_right) && (y >= m_top) && (y <= m_bottom);
00076 }
00077 
00078 bool SgRect::Contains(const SgRect& rect) const
00079 {
00080     return (m_left <= rect.m_left) && (m_right >= rect.m_right)
00081         && (m_top <= rect.m_top) && (m_bottom >= rect.m_bottom);
00082 }
00083 
00084 bool SgRect::Overlaps(const SgRect& rect2) const
00085 {
00086     return (((m_left >= rect2.m_left) && (m_left <= rect2.m_right))
00087             || ((rect2.m_left >= m_left) && (rect2.m_left <= m_right)))
00088         && (((m_top >= rect2.m_top) && (m_top <= rect2.m_bottom))
00089             || ((rect2.m_top >= m_top) && (rect2.m_top <= m_bottom)));
00090 }
00091 
00092 void SgRect::Expand(int margin)
00093 {
00094     m_left -= margin;
00095     m_right += margin;
00096     m_top -= margin;
00097     m_bottom += margin;
00098 }
00099 
00100 //----------------------------------------------------------------------------
00101 


Sun Mar 13 2011 Doxygen 1.7.1