00001 #ifndef Impala_Core_Geometry_RectanglePyramid_h
00002 #define Impala_Core_Geometry_RectanglePyramid_h
00003
00004 #include "Core/Geometry/RectangleSet.h"
00005 #include "Core/Geometry/MakeOverlappingRects.h"
00006
00007 namespace Impala
00008 {
00009 namespace Core
00010 {
00011 namespace Geometry
00012 {
00013
00014
00017 class RectanglePyramid
00018 {
00019 public:
00020
00021 RectanglePyramid()
00022 {
00023 mImWidth = -1;
00024 mImHeight = -1;
00025 mBorderWidth = -1;
00026 mNrRectPerDimMin = -1;
00027 mNrRectPerDimMax = -1;
00028 mNrRectStepSize = -1;
00029 }
00030
00031 RectanglePyramid(int borderWidth, int nrRectPerDimMin, int nrRectPerDimMax,
00032 int nrRectStepSize, int imWidth, int imHeight)
00033 {
00034 mImWidth = -1;
00035 mImHeight = -1;
00036 mBorderWidth = borderWidth;
00037 mNrRectPerDimMin = nrRectPerDimMin;
00038 mNrRectPerDimMax = nrRectPerDimMax;
00039 mNrRectStepSize = nrRectStepSize;
00040 int curR = 0;
00041 for (int nr=mNrRectPerDimMin ; nr<=mNrRectPerDimMax ;
00042 nr+=mNrRectStepSize)
00043 {
00044 mRectSet.push_back(RectangleSet());
00045 mNrRectsPerDim.push_back(nr);
00046 }
00047 if((imWidth >=0) && (imHeight >= 0)) {
00048
00049 SetImageSize(imWidth, imHeight);
00050 }
00051 }
00052
00053 void
00054 SetImageSize(int imWidth, int imHeight)
00055 {
00056 if (mBorderWidth == -1)
00057 return;
00058 if ((imWidth == mImWidth) && (imHeight == mImHeight))
00059 return;
00060 mImWidth = imWidth;
00061 mImHeight = imHeight;
00062 for (int i=0 ; i<mRectSet.size() ; i++)
00063 {
00064 mRectSet[i].clear();
00065 MakeOverlappingRects(std::back_inserter(mRectSet[i]),
00066 mImWidth, mImHeight, mBorderWidth,
00067 mNrRectsPerDim[i], mNrRectsPerDim[i], 1);
00068 }
00069 }
00070
00071 int
00072 NrLevels() const
00073 {
00074 return mNrRectsPerDim.size();
00075 }
00076
00077 int
00078 NrRectsPerDim(int level) const
00079 {
00080 return mNrRectsPerDim[level];
00081 }
00082
00083 int
00084 TotalNrRects() const
00085 {
00086 if (mNrRectPerDimMin == -1)
00087 return 0;
00088 int sum = 0;
00089 for (int nr=mNrRectPerDimMin ; nr<=mNrRectPerDimMax ;
00090 nr+=mNrRectStepSize)
00091 {
00092 sum += (nr+(nr-1))*(nr+(nr-1));
00093 }
00094 return sum;
00095 }
00096
00097 int
00098 NrRects(int level) const
00099 {
00100 if (mRectSet[level].size() != 0)
00101 return mRectSet[level].size();
00102 int r = NrRectsPerDim(level);
00103 return (r+(r-1))*(r+(r-1));
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119 Rectangle
00120 Rect(int level, int nr) const
00121 {
00122 return mRectSet[level][nr];
00123 }
00124
00125 int
00126 GetBorderWidth() const
00127 {
00128 return mBorderWidth;
00129 }
00130
00131 int
00132 GetImWidth() const
00133 {
00134 return mImWidth;
00135 }
00136
00137 int
00138 GetImHeight() const
00139 {
00140 return mImHeight;
00141 }
00142
00143 private:
00144
00145 int mImWidth;
00146 int mImHeight;
00147 int mBorderWidth;
00148 int mNrRectPerDimMin;
00149 int mNrRectPerDimMax;
00150 int mNrRectStepSize;
00151 std::vector<RectangleSet> mRectSet;
00152 std::vector<int> mNrRectsPerDim;
00153
00154 };
00155
00156 }
00157 }
00158 }
00159
00160 #endif