10 # include <vcl_msvc_warnings.h> 14 #define trace(str) { std::cerr << str << std::endl; } 21 template <
class V,
class B,
class C>
35 template <
class V,
class B,
class C>
39 for (
unsigned int i=0; i<local_chs; ++i)
43 template <
class V,
class B,
class C>
50 template <
class V,
class B,
class C>
57 template <
class V,
class B,
class C>
61 update_total_vts(diff);
64 template <
class V,
class B,
class C>
68 update_total_chs(diff);
76 template <
class V,
class B,
class C>
81 return find(tmp,
v, n, i);
84 template <
class V,
class B,
class C>
87 if (C::meet(b, bounds)) {
89 for (
unsigned int i=0; i<local_vts; ++i) {
91 *n_out = const_cast<node*>(
this);
97 for (
unsigned int i=0; i<local_chs; ++i)
98 if (chs[i]->find(b,
v, n_out, i_out))
107 template <
class V,
class B,
class C>
110 std::cout <<
"node bounds: ";
111 bounds.print(std::cout);
112 std::cout <<
"\n--------";
113 for (
unsigned int i=0; i<local_chs; ++i) {
117 std::cout <<
"------------" << std::endl;
124 template <
class V,
class B,
class C>
129 vts[local_vts++] =
v;
132 C::update(bounds,
v);
143 chs[local_chs++] = nn;
147 C::update(bounds,
v);
155 node *child =
nullptr;
159 for (
unsigned int i=0; i<local_chs; ++i)
160 if (chs[i]->total_vts < child->total_vts)
166 for (
unsigned int i=0; i<local_chs; ++i) {
167 B tmp(chs[i]->bounds);
169 float dd = C::volume(tmp) - C::volume(chs[i]->bounds);
170 if (best==-1 || dd<cost) {
179 return child->
add(
v);
183 template <
class V,
class B,
class C>
192 update_total_vts(-1);
196 vts[i] = vts[local_vts];
206 update_total_vts(-1);
223 assert(n == p->
chs[j]);
246 template <
class V,
class B,
class C>
250 for (
unsigned int i=0; i<parent->local_chs; ++i)
251 if (parent->chs[i] ==
this)
253 assert(!
"this not found in parent");
254 return (
unsigned int)(-1);
259 template <
class V,
class B,
class C>
263 C::init(bounds, vts[0]);
264 for (
unsigned int i=1; i<local_vts; ++i)
265 C::update(bounds, vts[i]);
266 for (
unsigned i=0; i<local_chs; ++i)
267 C::update(bounds, chs[i]->bounds );
269 else if (local_chs>0) {
270 bounds = chs[0]->bounds;
271 for (
unsigned int i=1; i<local_chs; ++i)
272 C::update(bounds, chs[i]->bounds );
275 assert(!
"This cannot happen. this node should be pruned.");
283 template <
class V,
class B,
class C>
287 std::cout <<
" In get: " << region << std::endl;
290 for (
unsigned int i=0; i<local_vts; ++i)
291 if (C::meet(region, vts[i] )) {
293 std::cout <<
" pushed " << vts[i] << std::endl;
295 vs.push_back(vts[i]);
299 for (
unsigned int i=0; i<local_chs; ++i)
300 if (C::meet(region, chs[i]->bounds )) {
302 std::cout <<
"--- region of child: " << i <<
" :" << chs[i]->bounds <<
" met search region----\n";
304 chs[i]->get(region, vs);
309 template <
class V,
class B,
class C>
313 for (
unsigned int i=0; i<local_vts; ++i)
314 if (region.
meets( vts[i] ))
315 vs.push_back(vts[i]);
318 for (
unsigned int i=0; i<local_chs; ++i)
319 if (region.
meets( chs[i]->bounds ))
320 chs[i]->get(region, vs);
323 template <
class V,
class B,
class C>
326 vs.reserve(vs.size() + total_vts);
328 for (
unsigned int i=0; i<local_vts; ++i)
329 vs.push_back(vts[i]);
331 for (
unsigned int i=0; i<local_chs; ++i)
338 template <
class V,
class B,
class C>
345 if (i < current->local_vts)
348 if (current->local_chs > 0) {
350 current = current->chs[0];
372 if (j<p->local_chs) {
384 template <
class V,
class B,
class C>
387 assert(!
"not implemented");
390 template <
class V,
class B,
class C>
402 #define VGL_RTREE_INSTANTIATE_tagged(tag, V, B, C) \ 403 template class vgl_rtree_probe<V, B, C >; \ 404 template class vgl_rtree_node<V, B, C >; \ 405 template class vgl_rtree_iterator_base<V, B, C >; \ 406 typedef vgl_rtree_iterator_base<V, B, C > itVBC##tag; \ 407 template bool operator==(itVBC##tag const &, itVBC##tag const &); \ 409 template class vgl_rtree_iterator<V, B, C >; \ 410 template class vgl_rtree_const_iterator<V, B, C >; \ 411 template class vgl_rtree<V, B, C > 414 #define VGL_RTREE_INSTANTIATE_expand(tag, V, B, C) \ 415 VGL_RTREE_INSTANTIATE_tagged(tag, V, B, C) 417 #undef VGL_RTREE_INSTANTIATE 418 #define VGL_RTREE_INSTANTIATE(V, B, C) \ 419 VGL_RTREE_INSTANTIATE_expand(__LINE__, V, B, C) void get_all(std::vector< V > &vs) const
void update_total_vts(int diff)
unsigned int find_index_in_parent() const
#define vgl_rtree_MAX_VERTICES
max. number of Vs stored in a node.
bool operator==(vgl_rtree_iterator_base< V, B, C > const &a, vgl_rtree_iterator_base< V, B, C > const &b)
node * chs[vgl_rtree_MAX_CHILDREN]
Represent a node in the rtree.
void update_vertex_count(int diff)
void update_child_count(int diff)
virtual bool meets(V const &v) const
return true if the probe "meets" the given object.
Templated rtree class and associated classes and functions.
vgl_rtree_node(node *parent, V const &v)
bool find(V const &v, node **n, int *i) const
void erase(unsigned int i)
void get(B const ®ion, std::vector< V > &) const
void update_total_chs(int diff)
#define vgl_rtree_MAX_CHILDREN
max. number of children of a given node.
V vts[vgl_rtree_MAX_VERTICES]
Base class for both rtree iterators.
Function predicate object for querying the tree.