30 if (!BaseType::Root())
34 BaseType::Root()->Range() =
35 typename BaseType::CellRange(BaseType::BeginHandle(), BaseType::EndHandle());
37 if (!BaseType::Root()->Size() || BaseType::Root()->Size() < BaseType::MaxBucketSize())
39 for (
unsigned int i = 0; i < CellType::NChildren; ++i)
41 if (this->ExistChild(*BaseType::Root(), i))
43 delete &((*BaseType::Root())[i]);
45 BaseType::Root()->Child(i, NULL);
48 if (this->IsLeaf(*BaseType::Root()))
52 typename BaseType::HandleType cur = BaseType::BeginHandle();
55 for (
unsigned int i = 0; i < BaseType::m_dim; ++i)
57 min[i] = -std::numeric_limits<ScalarType>::infinity();
58 max[i] = std::numeric_limits<ScalarType>::infinity();
60 for (
unsigned int i = 0; i < CellType::NChildren; ++i)
62 if (!this->ExistChild(*BaseType::Root(), i))
67 for (
unsigned int j = 0; j < BaseType::m_dim; ++j)
69 if (i & (1 << (BaseType::m_dim - j - 1)))
71 cmin[j] = BaseType::Root()->Center()[j];
77 cmax[j] = BaseType::Root()->Center()[j];
80 size_t d =
Rebuild(*BaseType::Root(), i, cmin, cmax, &cur);
86 BaseType::Root()->Range() =
typename BaseType::CellRange(BaseType::BeginHandle(), cur);
96 typename BaseType::HandleType* cur)
99 if (this->IsLeaf(cell))
101 typename BaseType::HandleType h = *cur;
102 if (h >= BaseType::EndHandle())
104 cell.Range() =
typename BaseType::CellRange(h, h);
107 size_t s = cell.Size();
108 for (
size_t i = 0; i < s && h < BaseType::EndHandle(); ++i, ++h)
110 size_t dref = this->Dereference(h);
112 for (
unsigned int j = 0; j < BaseType::m_dim; ++j)
114 if (BaseType::at(dref)[j] <=
min[j] || BaseType::at(dref)[j] >
max[j])
125 cell.Range() =
typename BaseType::CellRange(*cur, h);
132 typename BaseType::HandleType start = *cur;
133 unsigned int numChilds = 0;
135 for (
unsigned int i = 0; i < CellType::NChildren; ++i)
137 if (!this->ExistChild(cell, i))
142 for (
unsigned int j = 0; j < BaseType::m_dim; ++j)
144 if (i & (1 << (BaseType::m_dim - j - 1)))
146 cmin[j] = cell.Center()[j];
152 cmax[j] = cell.Center()[j];
155 size_t d =
Rebuild(cell, i, cmin, cmax, cur);
160 if (cell[i].Size() == 0)
170 cell.Range() =
typename BaseType::CellRange(start, *cur);
174 maxDepth = cell.Level();
176 else if (cell.Size() < BaseType::MaxBucketSize())
179 for (
unsigned int i = 0; i < CellType::NChildren; ++i)
181 if (!this->ExistChild(cell, i))
189 maxDepth = cell.Level();