Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef Box2D_H
00012 #define Box2D_H
00013
00014 #include "Point2D.h"
00015 #include <vector>
00016
00022 template<class T=float>
00023 class Box2D
00024 {
00025
00026 public:
00027
00029 Box2D(T minX=0, T minY=0, T maxX=0, T maxY=0);
00030
00032 ~Box2D() {};
00033
00034 inline void setMinX(T value) { m_MinX=value; }
00035 inline void setMaxX(T value) { m_MaxX=value; }
00036 inline void setMinY(T value) { m_MinY=value; }
00037 inline void setMaxY(T value) { m_MaxY=value; }
00038
00039 inline T minX() const { return m_MinX; }
00040 inline T maxX() const { return m_MaxX; }
00041 inline T minY() const { return m_MinY; }
00042 inline T maxY() const { return m_MaxY; }
00043
00044 inline T width() const { return m_MaxX-m_MinX; }
00045 inline T height() const { return m_MaxY-m_MinY; }
00046
00047 std::vector< Point2D > vertices();
00048
00050 void clip( Box2D<T> clipArea );
00051
00053 bool contains( T x, T y );
00054
00056 void expand( T size );
00057
00059 void shrink( T size );
00060
00062 void enclose( Point2D point );
00063 void enclose( T x, T y );
00064
00065 template<class OtherT>
00066 void enclose( Box2D<OtherT> box );
00067
00068 Point2D centerPoint()
00069 {
00070 Point2D center;
00071 center.setX(m_MinX + ( (m_MaxX - m_MinX) / 2 ) );
00072 center.setY(m_MinY + ( (m_MaxY - m_MinY) / 2 ) );
00073 return center;
00074 }
00075
00077 T area();
00078
00079 Box2D<T>& operator/= ( T div ) { m_MinX/=div; m_MinY/=div; m_MaxX/=div; m_MaxY/=div; return *this; }
00080 Box2D<T>& operator*= ( T div ) { m_MinX*=div; m_MinY*=div; m_MaxX*=div; m_MaxY*=div; return *this; }
00081
00082 private:
00083
00084 T m_MinX;
00085 T m_MaxX;
00086 T m_MinY;
00087 T m_MaxY;
00088
00089 };
00090
00091 template<class T>
00092 Box2D<T>::Box2D(T minX, T minY, T maxX, T maxY)
00093 {
00094 m_MinX=minX;
00095 m_MinY=minY;
00096 m_MaxX=maxX;
00097 m_MaxY=maxY;
00098 }
00099
00100 template<class T>
00101 void Box2D<T>::clip( Box2D<T> clipArea )
00102 {
00103 if (m_MinX < clipArea.minX()) { m_MinX=clipArea.minX(); }
00104 if (m_MinY < clipArea.minY()) { m_MinY=clipArea.minY(); }
00105 if (m_MaxX > clipArea.maxX()) { m_MaxX=clipArea.maxX(); }
00106 if (m_MaxY > clipArea.maxY()) { m_MaxY=clipArea.maxY(); }
00107 }
00108
00109 template<class T>
00110 bool Box2D<T>::contains( T x, T y )
00111 {
00112 return ( (x>=m_MinX) && (x<=m_MaxX) && (y>=m_MinY) && (y<=m_MaxY) );
00113 }
00114
00115 template<class T>
00116 void Box2D<T>::expand( T size )
00117 {
00118 m_MinX-=size;
00119 m_MaxX+=size;
00120 m_MinY-=size;
00121 m_MaxY+=size;
00122 }
00123
00124 template<class T>
00125 void Box2D<T>::shrink( T size )
00126 {
00127 m_MinX+=size;
00128 m_MaxX-=size;
00129 m_MinY+=size;
00130 m_MaxY-=size;
00131 }
00132
00133 template<class T>
00134 T Box2D<T>::area()
00135 {
00136 T width = m_MaxX - m_MinX;
00137 T height = m_MaxY - m_MinY;
00138
00139 T capacity = width * height;
00140
00141 return (T) capacity;
00142 }
00143
00144 template<class T>
00145 void Box2D<T>::enclose( Point2D point )
00146 {
00147 if ( m_MinX > point.x() ) { m_MinX=point.x(); }
00148 if ( m_MinY > point.y() ) { m_MinY=point.y(); }
00149 if ( m_MaxX < point.x() ) { m_MaxX=point.x(); }
00150 if ( m_MaxY < point.y() ) { m_MaxY=point.y(); }
00151 }
00152
00153 template<class T>
00154 void Box2D<T>::enclose( T x, T y )
00155 {
00156 if ( m_MinX > x ) { m_MinX=x; }
00157 if ( m_MinY > y ) { m_MinY=y; }
00158 if ( m_MaxX < x ) { m_MaxX=x; }
00159 if ( m_MaxY < y ) { m_MaxY=y; }
00160 }
00161
00162 template<class T>
00163 template<class OtherT>
00164 void Box2D<T>::enclose( Box2D<OtherT> box )
00165 {
00166 enclose( box.minX(), box.minY() );
00167 enclose( box.maxX(), box.maxY() );
00168 }
00169
00170
00171 template<class T>
00172 std::vector< Point2D > Box2D<T>::vertices()
00173 {
00174 std::vector<Point2D> myVertices(5);
00175 myVertices[0]=Point2D( m_MinX-0.5, m_MinY-0.5 );
00176 myVertices[1]=Point2D( m_MinX-0.5, m_MaxY+0.5 );
00177 myVertices[2]=Point2D( m_MaxX+0.5, m_MaxY+0.5 );
00178 myVertices[3]=Point2D( m_MaxX+0.5, m_MinY-0.5 );
00179 myVertices[4]=myVertices[0];
00180 return myVertices;
00181 }
00182
00183
00184 #endif