9 AllLocalData(vector<int> *vin,
int iN,
int inn,
int ipow2):
10 IndexTable(vin), N(iN), n(inn), pow2(ipow2) {}
12 AllLocalData(
const AllLocalData &other):
13 IndexTable(other.IndexTable),
18 vector<int> *IndexTable;
24 AllLocalData& operator=(
const AllLocalData& other);
30 Context (vector<int>* par,AllLocalData
const& local_data,
int i):
31 _params(par), _data(local_data), _i(i) {}
48 pair<int,int> rot(
int n, pair<int,int>
const& origin, pair<int,int>
const& r)
50 pair<int,int> res = origin;
53 res = pair<int,int>(n-1-res.first,n-1-res.second);
54 return pair<int,int>(res.second,res.first);
61 int xy2d (
int n,
int x,
int y) {
63 pair<int,int> temp(x,y);
64 for (
int s=n/2; s>0; s/=2) {
65 const pair<int,int> r((x&s)>0,(y&s)>0);
66 d += s * s * ((3 * r.first) ^ r.second);
67 temp = rot(s, temp, r);
74 vector<int> range(
int n)
76 vector<int> res(static_cast<size_t>(n));
77 for(
size_t i=0;i<res.size();++i)
78 res[i] = static_cast<int>(i);
82 template<
class T>
void zero_pad_start(vector<T>& v,
int n)
84 const vector<int> temp(static_cast<size_t>(n));
85 v.insert(v.begin(),temp.begin(),temp.end());
88 int calc_d(pair<double, double>
const& dxdy,
89 pair<double, double>
const& xminymin,
93 if(dxdy.first<=0&&dxdy.second<=0)
96 const pair<int, int> index
97 (dxdy.first <=0 ? 0 : static_cast<int>((cor.
x-xminymin.first)/dxdy.first),
98 dxdy.second <=0 ? 0 : static_cast<int>((cor.
y-xminymin.second)/dxdy.second));
99 return xy2d(pow2,index.first,index.second);
103 vector<int>
HilbertOrder(vector<Vector2D>
const& cor,
int num,
int innernum)
106 return vector<int> ();
107 const int N=num-innernum;
108 vector<int> insert_order;
110 insert_order.reserve(static_cast<size_t>(N));
111 stack<Context*> context_list;
112 stack<vector<int>*> IndexTableStack;
113 const int temp_n=
max(static_cast<int>(sqrt(static_cast<double>(N))),2);
114 const int temp_pow2=
max(static_cast<int>(pow(2.0,static_cast<int>(log(1.0*temp_n)/log(2.0)))),2);
115 AllLocalData d_local_data(0,N,temp_n,temp_pow2);
116 vector<int> p = range(N);
117 vector<int>* param = &p;
118 Context *context=
new Context(param,d_local_data,0);
119 context_list.push(context);
121 const vector<Vector2D> cortemp(cor.begin()+innernum,
123 while(!context_list.empty())
125 context=context_list.top();
126 AllLocalData local_data=context->_data;
127 param=context->_params;
131 if(static_cast<int>(context_list.size())>N)
133 UniversalError eo(
"Error in creating the hilbert order, probably two points are identical");
138 vector<Vector2D> p_cor(static_cast<size_t>(local_data.N));
139 for(
size_t j=0;j<static_cast<size_t>(local_data.N);++j)
140 p_cor[j] = cortemp[static_cast<size_t>(param->at(j))];
141 const double xmin=(*min_element(p_cor.begin(),
144 const double xmax=(*max_element(p_cor.begin(),
147 const double ymin=(*min_element(p_cor.begin(),
150 const double ymax=(*max_element(p_cor.begin(),
153 const double dx=
static_cast<double>(xmax-xmin)/(local_data.pow2-1);
154 const double dy=
static_cast<double>(ymax-ymin)/(local_data.pow2-1);
155 local_data.IndexTable=
new vector<int>[local_data.pow2*local_data.pow2];
156 for(
int j=0;j<local_data.N;j++){
158 (pair<double,double>(dx,dy),
159 pair<double,double>(xmin,ymin),
160 p_cor[static_cast<size_t>(j)],local_data.pow2);
161 local_data.IndexTable[d].push_back(param->at(static_cast<size_t>(j)));
164 if(i<(local_data.pow2*local_data.pow2-1))
166 context =
new Context(param, local_data,i+1);
167 context_list.push(context);
169 if(local_data.IndexTable[i].size()<2)
172 for(
size_t k=0;k<local_data.IndexTable[i].size();k++)
173 insert_order.push_back(local_data.IndexTable[i][k]);
178 int temp_n2=
max(static_cast<int>(sqrt(
double(local_data.IndexTable[i].size()))),2);
180 (&local_data.IndexTable[i],
183 static_cast<int>(local_data.IndexTable[i].size()),
185 max(static_cast<int>(pow(2.0,static_cast<int>(log(1.0*temp_n2)/log(2.0)))),2)), 0);
186 context_list.push(context);
188 if(i==(local_data.pow2*local_data.pow2-1))
190 for(
size_t l=0;l<IndexTableStack.size();++l)
192 delete [] IndexTableStack.top();
193 IndexTableStack.pop();
196 delete [] local_data.IndexTable;
198 IndexTableStack.push(local_data.IndexTable);
203 zero_pad_start(insert_order,innernum);
204 for(
int i=0;i<num;++i)
207 insert_order[
static_cast<size_t>(i)]=i;
209 insert_order[
static_cast<size_t>(i)]+=innernum;
Container for error reports.
Hilbert space filling curve.
double max(vector< double > const &v)
returns the maximal term in a vector
double y
Component in the y direction.
vector< int > HilbertOrder(vector< Vector2D > const &cor, int num, int innernum=0)
Returns the Hilber curve ordering.
double x
Component in the x direction.