00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef HCORE_HH_
00021 #define HCORE_HH_
00022
00023
00024 #include <algorithm>
00025 #include <set>
00026 #include <vector>
00027 #include <limits.h>
00028
00029 #include <biu/Point.hh>
00030 #include <biu/LatticeFrame.hh>
00031
00032 namespace cpsp
00033 {
00034
00041 class HCore
00042 {
00043 public:
00045 typedef biu::IntPoint CorePoint;
00047 typedef std::set<CorePoint> CPointSet;
00048
00049 protected:
00050
00052 class CoreFrame {
00053 public:
00055 int minX, minY, minZ;
00057 int maxX, maxY, maxZ;
00058
00060 void reset() {
00061 minX = minY = minZ = INT_MAX;
00062 maxX = maxY = maxZ = 0;
00063 }
00065 void resize(const biu::IntPoint& p) {
00066 minX = std::min( minX, p.getX() );
00067 minY = std::min( minY, p.getY() );
00068 minZ = std::min( minZ, p.getZ() );
00069 maxX = std::max( maxX, p.getX() );
00070 maxY = std::max( maxY, p.getY() );
00071 maxZ = std::max( maxZ, p.getZ() );
00072 }
00074 biu::IntPoint getCenter() const {
00075 return biu::IntPoint( minX + ((maxX-minX)/2),
00076 minY + ((maxY-minY)/2),
00077 minZ + ((maxZ-minZ)/2));
00078 }
00079
00081 biu::IntPoint getMinCorner() const {
00082 return biu::IntPoint( minX, minY, minZ );
00083 }
00084
00086 biu::IntPoint getMaxCorner() const {
00087 return biu::IntPoint( maxX, maxY, maxZ );
00088 }
00089
00091 int getMaxDimension() const {
00092 return std::max( maxX-minX,
00093 std::max( maxY-minY,
00094 maxZ-minZ))
00095 + 1 ;
00096 }
00097 };
00098
00099 typedef std::vector<biu::IndexSet> IndSetVec;
00100
00102 unsigned int contacts;
00104 unsigned int size;
00105
00106 CPointSet points;
00107
00108 int numOfPSinglets;
00109 int numOfHSinglets;
00110
00111 CoreFrame coreFrame;
00112
00114 unsigned int actFrameSize;
00115
00117 IndSetVec hull;
00118
00120 biu::IndexSet pSinglets;
00122 biu::IndexSet hSinglets;
00123
00126 void indexHulls(const biu::LatticeFrame* latFrame,
00127 const unsigned int maxHullLevel);
00128
00130 unsigned int evenPositions;
00131
00132 public:
00133
00134 HCore();
00135 HCore(const unsigned int contacts, const unsigned int size);
00136 virtual ~HCore();
00137
00139 const CoreFrame * const
00140 getCoreFrame() const { return &coreFrame; }
00141
00145 unsigned int
00146 getSize() const { return size; }
00147
00149 unsigned int
00150 getContacts() const { return contacts; }
00151
00154 bool
00155 isValid() const { return size == points.size(); }
00156
00158 const biu::IPointSet&
00159 getPoints() const { return points; }
00160
00164 void
00165 reset(const unsigned int contacts, const unsigned int size);
00166
00168 void
00169 addPoint(const CorePoint& toAdd);
00170
00172 biu::IntPoint
00173 getCenter() const { return coreFrame.getCenter(); }
00174
00177 const biu::IndexSet&
00178 getIndexedHull( const biu::LatticeFrame* latFrame,
00179 const unsigned int hullLevel);
00180
00182 int
00183 getMaxDimension() const { return coreFrame.getMaxDimension(); }
00184
00187 int
00188 getNumOfPSinglets(const biu::LatticeFrame* latFrame);
00189
00192 int
00193 getNumOfHSinglets(const biu::LatticeFrame* latFrame);
00194
00197 const biu::IndexSet&
00198 getIndexedPSinglets(const biu::LatticeFrame* latFrame);
00199
00202 const biu::IndexSet&
00203 getIndexedHSinglets(const biu::LatticeFrame* latFrame);
00204
00206 unsigned int
00207 getMinEvenOdd(void);
00208 };
00209
00210 }
00211
00212 #endif