38 #ifndef HPP_FCL_HIERARCHY_TREE_INL_H
39 #define HPP_FCL_HIERARCHY_TREE_INL_H
49 template <
typename BV>
54 max_lookahead_level = -1;
56 bu_threshold = bu_threshold_;
57 topdown_level = topdown_level_;
61 template <
typename BV>
67 template <
typename BV>
88 template <
typename BV>
91 Node* leaf = createNode(
nullptr, bv, data);
92 insertLeaf(root_node, leaf);
98 template <
typename BV>
106 template <
typename BV>
108 if (root_node) recurseDeleteNode(root_node);
112 max_lookahead_level = -1;
117 template <
typename BV>
119 return (
nullptr == root_node);
123 template <
typename BV>
136 if (lookahead_level > 0) {
138 for (
int i = 0; (i < lookahead_level) && sub_root->
parent; ++i)
139 sub_root = sub_root->
parent;
143 sub_root = root_node;
147 insertLeaf(sub_root, leaf);
151 template <
typename BV>
153 if (leaf->
bv.contain(bv))
return false;
159 template <
typename S,
typename BV>
164 if (leaf->
bv.contain(bv))
return false;
165 tree.update_(leaf, bv);
172 if (leaf->
bv.contain(bv))
return false;
173 tree.update_(leaf, bv);
179 template <
typename BV>
186 template <
typename BV>
192 template <
typename BV>
194 if (!root_node)
return 0;
195 return getMaxHeight(root_node);
199 template <
typename BV>
201 if (!root_node)
return 0;
204 getMaxDepth(root_node, 0, max_depth);
209 template <
typename BV>
212 std::vector<Node*> leaves;
213 leaves.reserve(n_leaves);
214 fetchLeaves(root_node, leaves);
215 bottomup(leaves.begin(), leaves.end());
216 root_node = leaves[0];
221 template <
typename BV>
224 std::vector<Node*> leaves;
225 leaves.reserve(n_leaves);
226 fetchLeaves(root_node, leaves);
227 root_node = topdown(leaves.begin(), leaves.end());
232 template <
typename BV>
234 if (iterations < 0) iterations = (int)n_leaves;
235 if (root_node && (iterations > 0)) {
236 for (
int i = 0; i < iterations; ++i) {
237 Node* node = root_node;
238 unsigned int bit = 0;
240 node = sort(node, root_node)->
children[(opath >> bit) & 1];
241 bit = (bit + 1) & (
sizeof(
unsigned int) * 8 - 1);
250 template <
typename BV>
252 if (root_node) recurseRefit(root_node);
256 template <
typename BV>
258 std::vector<Node*>& leaves)
const {
260 extractLeaves(root->
children[0], leaves);
261 extractLeaves(root->
children[1], leaves);
263 leaves.push_back(root);
267 template <
typename BV>
273 template <
typename BV>
279 template <
typename BV>
285 template <
typename BV>
287 for (
int i = 0; i < depth; ++i) std::cout <<
" ";
288 std::cout <<
" (" << root->
bv.min_[0] <<
", " << root->
bv.min_[1] <<
", "
289 << root->
bv.min_[2] <<
"; " << root->
bv.max_[0] <<
", "
290 << root->
bv.max_[1] <<
", " << root->
bv.max_[2] <<
")" << std::endl;
293 print(root->
children[0], depth + 1);
294 print(root->
children[1], depth + 1);
299 template <
typename BV>
301 const NodeVecIterator lend) {
302 NodeVecIterator lcur_end = lend;
303 while (lbeg < lcur_end - 1) {
304 NodeVecIterator min_it1 = lbeg;
305 NodeVecIterator min_it2 = lbeg + 1;
306 FCL_REAL min_size = (std::numeric_limits<FCL_REAL>::max)();
307 for (NodeVecIterator it1 = lbeg; it1 < lcur_end; ++it1) {
308 for (NodeVecIterator it2 = it1 + 1; it2 < lcur_end; ++it2) {
309 FCL_REAL cur_size = ((*it1)->bv + (*it2)->bv).size();
310 if (cur_size < min_size) {
318 Node* n[2] = {*min_it1, *min_it2};
319 Node* p = createNode(
nullptr, n[0]->bv, n[1]->bv,
nullptr);
320 p->children[0] = n[0];
321 p->children[1] = n[1];
325 Node* tmp = *min_it2;
327 *min_it2 = *lcur_end;
333 template <
typename BV>
335 const NodeVecIterator lbeg,
const NodeVecIterator lend) {
336 switch (topdown_level) {
338 return topdown_0(lbeg, lend);
341 return topdown_1(lbeg, lend);
344 return topdown_0(lbeg, lend);
349 template <
typename BV>
351 if (!node->isLeaf()) {
352 size_t height1 = getMaxHeight(node->children[0]);
353 size_t height2 = getMaxHeight(node->children[1]);
354 return std::max(height1, height2) + 1;
360 template <
typename BV>
362 size_t& max_depth)
const {
363 if (!node->isLeaf()) {
364 getMaxDepth(node->children[0], depth + 1, max_depth);
365 getMaxDepth(node->children[1], depth + 1, max_depth);
367 max_depth = std::max(max_depth, depth);
371 template <
typename BV>
373 const NodeVecIterator lbeg,
const NodeVecIterator lend) {
374 long num_leaves = lend - lbeg;
375 if (num_leaves > 1) {
376 if (num_leaves > bu_threshold) {
377 BV vol = (*lbeg)->bv;
378 for (NodeVecIterator it = lbeg + 1; it < lend; ++it) vol += (*it)->bv;
381 FCL_REAL extent[3] = {vol.width(), vol.height(), vol.depth()};
382 if (extent[1] > extent[0]) best_axis = 1;
383 if (extent[2] > extent[best_axis]) best_axis = 2;
386 NodeVecIterator lcenter = lbeg + num_leaves / 2;
387 std::nth_element(lbeg, lcenter, lend,
388 std::bind(&nodeBaseLess<BV>, std::placeholders::_1,
389 std::placeholders::_2, std::ref(best_axis)));
391 Node* node = createNode(
nullptr, vol,
nullptr);
392 node->children[0] = topdown_0(lbeg, lcenter);
393 node->children[1] = topdown_0(lcenter, lend);
394 node->children[0]->parent = node;
395 node->children[1]->parent = node;
398 bottomup(lbeg, lend);
406 template <
typename BV>
407 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::topdown_1(
408 const NodeVecIterator lbeg,
const NodeVecIterator lend) {
409 long num_leaves = lend - lbeg;
410 if (num_leaves > 1) {
411 if (num_leaves > bu_threshold) {
412 Vec3f split_p = (*lbeg)->bv.center();
413 BV vol = (*lbeg)->bv;
415 for (it = lbeg + 1; it < lend; ++it) {
416 split_p += (*it)->bv.center();
419 split_p /=
static_cast<FCL_REAL>(num_leaves);
421 long bestmidp = num_leaves;
422 int splitcount[3][2] = {{0, 0}, {0, 0}, {0, 0}};
423 for (it = lbeg; it < lend; ++it) {
424 Vec3f x = (*it)->bv.center() - split_p;
425 for (
int j = 0; j < 3; ++j) ++splitcount[j][x[j] > 0 ? 1 : 0];
428 for (
int i = 0; i < 3; ++i) {
429 if ((splitcount[i][0] > 0) && (splitcount[i][1] > 0)) {
430 long midp = std::abs(splitcount[i][0] - splitcount[i][1]);
431 if (midp < bestmidp) {
438 if (best_axis < 0) best_axis = 0;
440 FCL_REAL split_value = split_p[best_axis];
441 NodeVecIterator lcenter = lbeg;
442 for (it = lbeg; it < lend; ++it) {
443 if ((*it)->bv.center()[best_axis] < split_value) {
451 Node* node = createNode(
nullptr, vol,
nullptr);
452 node->children[0] = topdown_1(lbeg, lcenter);
453 node->children[1] = topdown_1(lcenter, lend);
454 node->children[0]->parent = node;
455 node->children[1]->parent = node;
458 bottomup(lbeg, lend);
466 template <
typename BV>
467 void HierarchyTree<BV>::init_0(std::vector<Node*>& leaves) {
469 root_node = topdown(leaves.begin(), leaves.end());
470 n_leaves = leaves.size();
471 max_lookahead_level = -1;
476 template <
typename BV>
477 void HierarchyTree<BV>::init_1(std::vector<Node*>& leaves) {
481 if (leaves.size() > 0) bound_bv = leaves[0]->bv;
482 for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
484 morton_functor<FCL_REAL, uint32_t> coder(bound_bv);
485 for (
size_t i = 0; i < leaves.size(); ++i)
486 leaves[i]->code = coder(leaves[i]->bv.center());
488 std::sort(leaves.begin(), leaves.end(), SortByMorton());
490 root_node = mortonRecurse_0(leaves.begin(), leaves.end(),
491 (1 << (coder.bits() - 1)), coder.bits() - 1);
494 n_leaves = leaves.size();
495 max_lookahead_level = -1;
500 template <
typename BV>
501 void HierarchyTree<BV>::init_2(std::vector<Node*>& leaves) {
505 if (leaves.size() > 0) bound_bv = leaves[0]->bv;
506 for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
508 morton_functor<FCL_REAL, uint32_t> coder(bound_bv);
509 for (
size_t i = 0; i < leaves.size(); ++i)
510 leaves[i]->code = coder(leaves[i]->bv.center());
512 std::sort(leaves.begin(), leaves.end(), SortByMorton());
514 root_node = mortonRecurse_1(leaves.begin(), leaves.end(),
515 (1 << (coder.bits() - 1)), coder.bits() - 1);
518 n_leaves = leaves.size();
519 max_lookahead_level = -1;
524 template <
typename BV>
525 void HierarchyTree<BV>::init_3(std::vector<Node*>& leaves) {
529 if (leaves.size() > 0) bound_bv = leaves[0]->bv;
530 for (
size_t i = 1; i < leaves.size(); ++i) bound_bv += leaves[i]->bv;
532 morton_functor<FCL_REAL, uint32_t> coder(bound_bv);
533 for (
size_t i = 0; i < leaves.size(); ++i)
534 leaves[i]->code = coder(leaves[i]->bv.center());
536 std::sort(leaves.begin(), leaves.end(), SortByMorton());
538 root_node = mortonRecurse_2(leaves.begin(), leaves.end());
541 n_leaves = leaves.size();
542 max_lookahead_level = -1;
547 template <
typename BV>
548 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::mortonRecurse_0(
549 const NodeVecIterator lbeg,
const NodeVecIterator lend,
550 const uint32_t& split,
int bits) {
551 long num_leaves = lend - lbeg;
552 if (num_leaves > 1) {
556 NodeVecIterator lcenter =
557 std::lower_bound(lbeg, lend, &dummy, SortByMorton());
559 if (lcenter == lbeg) {
560 uint32_t split2 = split | (1 << (bits - 1));
561 return mortonRecurse_0(lbeg, lend, split2, bits - 1);
562 }
else if (lcenter == lend) {
563 uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
564 return mortonRecurse_0(lbeg, lend, split1, bits - 1);
566 uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
567 uint32_t split2 = split | (1 << (bits - 1));
569 Node* child1 = mortonRecurse_0(lbeg, lcenter, split1, bits - 1);
570 Node* child2 = mortonRecurse_0(lcenter, lend, split2, bits - 1);
571 Node* node = createNode(
nullptr,
nullptr);
572 node->children[0] = child1;
573 node->children[1] = child2;
574 child1->parent = node;
575 child2->parent = node;
579 Node* node = topdown(lbeg, lend);
587 template <
typename BV>
588 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::mortonRecurse_1(
589 const NodeVecIterator lbeg,
const NodeVecIterator lend,
590 const uint32_t& split,
int bits) {
591 long num_leaves = lend - lbeg;
592 if (num_leaves > 1) {
596 NodeVecIterator lcenter =
597 std::lower_bound(lbeg, lend, &dummy, SortByMorton());
599 if (lcenter == lbeg) {
600 uint32_t split2 = split | (1 << (bits - 1));
601 return mortonRecurse_1(lbeg, lend, split2, bits - 1);
602 }
else if (lcenter == lend) {
603 uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
604 return mortonRecurse_1(lbeg, lend, split1, bits - 1);
606 uint32_t split1 = (split & (~(1 << bits))) | (1 << (bits - 1));
607 uint32_t split2 = split | (1 << (bits - 1));
609 Node* child1 = mortonRecurse_1(lbeg, lcenter, split1, bits - 1);
610 Node* child2 = mortonRecurse_1(lcenter, lend, split2, bits - 1);
611 Node* node = createNode(
nullptr,
nullptr);
612 node->children[0] = child1;
613 node->children[1] = child2;
614 child1->parent = node;
615 child2->parent = node;
619 Node* child1 = mortonRecurse_1(lbeg, lbeg + num_leaves / 2, 0, bits - 1);
620 Node* child2 = mortonRecurse_1(lbeg + num_leaves / 2, lend, 0, bits - 1);
621 Node* node = createNode(
nullptr,
nullptr);
622 node->children[0] = child1;
623 node->children[1] = child2;
624 child1->parent = node;
625 child2->parent = node;
633 template <
typename BV>
634 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::mortonRecurse_2(
635 const NodeVecIterator lbeg,
const NodeVecIterator lend) {
636 long num_leaves = lend - lbeg;
637 if (num_leaves > 1) {
638 Node* child1 = mortonRecurse_2(lbeg, lbeg + num_leaves / 2);
639 Node* child2 = mortonRecurse_2(lbeg + num_leaves / 2, lend);
640 Node* node = createNode(
nullptr,
nullptr);
641 node->children[0] = child1;
642 node->children[1] = child2;
643 child1->parent = node;
644 child2->parent = node;
651 template <
typename BV>
652 void HierarchyTree<BV>::update_(Node* leaf,
const BV& bv) {
653 Node* root = removeLeaf(leaf);
655 if (max_lookahead_level >= 0) {
656 for (
int i = 0; (i < max_lookahead_level) && root->parent; ++i)
663 insertLeaf(root, leaf);
667 template <
typename BV>
668 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::sort(Node* n, Node*& r) {
671 size_t i = indexOf(n);
673 Node* s = p->children[j];
676 q->children[indexOf(p)] = n;
682 p->children[0] = n->children[0];
683 p->children[1] = n->children[1];
684 n->children[0]->parent = p;
685 n->children[1]->parent = p;
688 std::swap(p->bv, n->bv);
695 template <
typename BV>
696 void HierarchyTree<BV>::insertLeaf(Node*
const sub_root, Node*
const leaf)
709 leaf->parent =
nullptr;
715 Node* sibling = sub_root;
716 while (!sibling->isLeaf()) {
717 sibling = sibling->children[
select(*leaf, *(sibling->children[0]),
718 *(sibling->children[1]))];
720 Node* prev = sibling->parent;
723 Node* node = createNode(prev, leaf->bv, sibling->bv,
nullptr);
737 prev->children[indexOf(sibling)] = node;
738 node->children[0] = sibling;
739 sibling->parent = node;
740 node->children[1] = leaf;
747 if (!prev->bv.contain(node->bv))
748 prev->bv = prev->children[0]->bv + prev->children[1]->bv;
752 }
while (
nullptr != (prev = node->parent));
762 node->children[0] = sibling;
763 sibling->parent = node;
764 node->children[1] = leaf;
776 template <
typename BV>
777 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::removeLeaf(
783 if (leaf == root_node) {
788 Node* parent = leaf->parent;
789 Node* prev = parent->parent;
790 Node* sibling = parent->children[1 - indexOf(leaf)];
808 prev->children[indexOf(parent)] = sibling;
809 sibling->parent = prev;
813 BV new_bv = prev->children[0]->bv + prev->children[1]->bv;
814 if (!(new_bv == prev->bv)) {
821 return prev ? prev : root_node;
834 sibling->parent =
nullptr;
841 template <
typename BV>
842 void HierarchyTree<BV>::fetchLeaves(Node* root, std::vector<Node*>& leaves,
844 if ((!root->isLeaf()) && depth) {
845 fetchLeaves(root->children[0], leaves, depth - 1);
846 fetchLeaves(root->children[1], leaves, depth - 1);
849 leaves.push_back(root);
854 template <
typename BV>
855 size_t HierarchyTree<BV>::indexOf(Node* node) {
857 return (node->parent->children[1] == node);
861 template <
typename BV>
862 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::createNode(Node* parent,
865 Node* node = createNode(parent, data);
871 template <
typename BV>
872 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::createNode(Node* parent,
876 Node* node = createNode(parent, data);
877 node->bv = bv1 + bv2;
882 template <
typename BV>
883 typename HierarchyTree<BV>::Node* HierarchyTree<BV>::createNode(Node* parent,
885 Node* node =
nullptr;
891 node->parent = parent;
893 node->children[1] = 0;
898 template <
typename BV>
899 void HierarchyTree<BV>::deleteNode(Node* node) {
900 if (free_node != node) {
907 template <
typename BV>
908 void HierarchyTree<BV>::recurseDeleteNode(Node* node) {
909 if (!node->isLeaf()) {
910 recurseDeleteNode(node->children[0]);
911 recurseDeleteNode(node->children[1]);
914 if (node == root_node) root_node =
nullptr;
919 template <
typename BV>
920 void HierarchyTree<BV>::recurseRefit(Node* node) {
921 if (!node->isLeaf()) {
922 recurseRefit(node->children[0]);
923 recurseRefit(node->children[1]);
924 node->bv = node->children[0]->bv + node->children[1]->bv;
930 template <
typename BV>
932 if (a->
bv.center()[d] < b->
bv.center()[d])
return true;
937 template <
typename S,
typename BV>
952 template <
typename BV>
959 template <
typename BV>
966 template <
typename S>
972 const AABB& bv1 = node1.
bv;
973 const AABB& bv2 = node2.
bv;
977 FCL_REAL d1 = fabs(v1[0]) + fabs(v1[1]) + fabs(v1[2]);
978 FCL_REAL d2 = fabs(v2[0]) + fabs(v2[1]) + fabs(v2[2]);
979 return (d1 < d2) ? 0 : 1;
984 const AABB& bv = query;
985 const AABB& bv1 = node1.
bv;
986 const AABB& bv2 = node2.
bv;
990 FCL_REAL d1 = fabs(v1[0]) + fabs(v1[1]) + fabs(v1[2]);
991 FCL_REAL d2 = fabs(v2[0]) + fabs(v2[1]) + fabs(v2[2]);
992 return (d1 < d2) ? 0 : 1;