6 return static_cast<int>(ceil(log(pow(static_cast<double>(cor.size()), (1.0 / 3.0))) / log(2.0)));
10 bool approx_equal(
double a,
double b,
double thres=1e-9)
18 void AdjustPoints(vector<Vector3D>
const & vPointsIn, vector<Vector3D> & vPointsOut)
21 vPointsOut.resize(vPointsIn.size());
23 vector<double> vPointsX, vPointsY, vPointsZ;
25 Split(vPointsIn, vPointsX, vPointsY, vPointsZ);
29 double dbMinX = *min_element(vPointsX.begin(), vPointsX.end());
30 double dbMinY = *min_element(vPointsY.begin(), vPointsY.end());
31 double dbMinZ = *min_element(vPointsZ.begin(), vPointsZ.end());
33 double dbMaxX = *max_element(vPointsX.begin(), vPointsX.end());
34 double dbMaxY = *max_element(vPointsY.begin(), vPointsY.end());
35 double dbMaxZ = *max_element(vPointsZ.begin(), vPointsZ.end());
37 double dbScaleX = dbMaxX - dbMinX;
38 double dbScaleY = dbMaxY - dbMinY;
39 double dbScaleZ = dbMaxZ - dbMinZ;
41 bool bFlagX = approx_equal(dbScaleX,0);
42 bool bFlagY = approx_equal(dbScaleY,0);
43 bool bFlagZ = approx_equal(dbScaleZ,0);
48 for (
size_t ii = 0; ii < vPointsIn.size(); ++ii)
51 vPointsX[ii] -= dbMinX;
52 vPointsX[ii] /= dbScaleX;
57 fill(vPointsX.begin(), vPointsX.end(), 0);
62 for (
size_t ii = 0; ii < vPointsIn.size(); ++ii)
65 vPointsY[ii] -= dbMinY;
66 vPointsY[ii] /= dbScaleY;
71 fill(vPointsY.begin(), vPointsY.end(), 0);
76 for (
size_t ii = 0; ii < vPointsIn.size(); ++ii)
78 vPointsZ[ii] -= dbMinZ;
79 vPointsZ[ii] /= dbScaleZ;
84 fill(vPointsZ.begin(), vPointsZ.end(), 0);
88 for (
size_t ii = 0; ii < vPointsIn.size(); ++ii)
90 vPointsOut[ii].x = vPointsX[ii];
91 vPointsOut[ii].y = vPointsY[ii];
92 vPointsOut[ii].z = vPointsZ[ii];
98 void FindEqualIndices(vector<size_t>
const & vD_sorted, vector<vector<size_t> > & vOut)
100 vector<size_t> vD_sorted_cpy = vD_sorted;
101 vector<size_t> vD_sorted_unq = vD_sorted;
103 vector<size_t>::iterator it1, itPrev, itCur;
104 it1 =
unique(vD_sorted_unq.begin(), vD_sorted_unq.end());
106 vD_sorted_unq.resize(static_cast<size_t>(
distance(vD_sorted_unq.begin(), it1)));
108 if (vD_sorted.size() == vD_sorted_unq.size())
113 vOut.reserve(vD_sorted.size() - vD_sorted_unq.size());
115 int iCurPrevDist = 0;
117 itPrev = vD_sorted_cpy.begin();
118 for (it1 = vD_sorted_unq.begin()+1; it1 != vD_sorted_unq.end(); ++it1)
120 if (
distance( it1 , vD_sorted_unq.end() ) == 0)
122 itCur = vD_sorted_cpy.end();
126 itCur = find(itPrev, vD_sorted_cpy.end(), *it1);
129 iCurPrevDist =
static_cast<int>(
distance(itPrev, itCur));
130 if (1 < iCurPrevDist)
132 int iBase =
static_cast<int>(
distance(vD_sorted_cpy.begin(), itPrev));
133 vector<size_t> vInd(static_cast<size_t>(iCurPrevDist));
136 for (
int ii = 0; ii < iCurPrevDist; ++ii)
138 vInd[
static_cast<size_t>(ii)] = static_cast<size_t>(iBase + ii);
140 vOut.push_back(vInd);
146 iCurPrevDist =
static_cast<int>(
distance(itPrev, vD_sorted_cpy.end()));
147 if (1 < iCurPrevDist )
149 int iBase =
static_cast<int>(
distance(vD_sorted_cpy.begin(), itPrev));
151 vector<size_t> vInd(static_cast<size_t>(iCurPrevDist));
152 for (
int ii = 0; ii < iCurPrevDist; ++ii)
154 vInd[
static_cast<size_t>(ii)] = static_cast<size_t>(iBase + ii);
156 vOut.push_back(vInd);
vector< T > unique(vector< T > const &v)
Returns a vector containing only unique elements.
void FindEqualIndices(vector< size_t > const &vD_sorted, vector< vector< size_t > > &vOut)
Scale a vector of 3D points to the unit-cube.
void AdjustPoints(vector< Vector3D > const &vPointsIn, vector< Vector3D > &vPointsOut)
Scale a vector of 3D points to the unit-cube.
Hilbert 3D Order - Utility functions.
void Split(vector< Vector3D > const &vIn, vector< double > &vX, vector< double > &vY, vector< double > &vZ)
Splits a vector of 3D points to components.
double abs(Vector3D const &v)
Norm of a vector.
int EstimateHilbertIterationNum(vector< Vector3D > const &cor)
Estimate the number of iterations required in the Hilbert Curve, according to the number of points...
double distance(Vector3D const &v1, Vector3D const &v2)
Calculates the distance between two vectors.