MCPcopy Create free account
hub / github.com/dfloreaa/point_lio_ros2 / BuildTree

Method BuildTree

include/ikd-Tree/ikd_Tree.cpp:679–733  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

677
678template <typename PointType>
679void KD_TREE<PointType>::BuildTree(KD_TREE_NODE **root, int l, int r, PointVector &Storage)
680{
681 if (l > r)
682 return;
683 *root = new KD_TREE_NODE;
684 InitTreeNode(*root);
685 int mid = (l + r) >> 1;
686 int div_axis = 0;
687 int i;
688 // Find the best division Axis
689 float min_value[3] = {INFINITY, INFINITY, INFINITY};
690 float max_value[3] = {-INFINITY, -INFINITY, -INFINITY};
691 float dim_range[3] = {0, 0, 0};
692 for (i = l; i <= r; i++)
693 {
694 min_value[0] = min(min_value[0], Storage[i].x);
695 min_value[1] = min(min_value[1], Storage[i].y);
696 min_value[2] = min(min_value[2], Storage[i].z);
697 max_value[0] = max(max_value[0], Storage[i].x);
698 max_value[1] = max(max_value[1], Storage[i].y);
699 max_value[2] = max(max_value[2], Storage[i].z);
700 }
701 // Select the longest dimension as division axis
702 for (i = 0; i < 3; i++)
703 dim_range[i] = max_value[i] - min_value[i];
704 for (i = 1; i < 3; i++)
705 if (dim_range[i] > dim_range[div_axis])
706 div_axis = i;
707 // Divide by the division axis and recursively build.
708
709 (*root)->division_axis = div_axis;
710 switch (div_axis)
711 {
712 case 0:
713 nth_element(begin(Storage) + l, begin(Storage) + mid, begin(Storage) + r + 1, point_cmp_x);
714 break;
715 case 1:
716 nth_element(begin(Storage) + l, begin(Storage) + mid, begin(Storage) + r + 1, point_cmp_y);
717 break;
718 case 2:
719 nth_element(begin(Storage) + l, begin(Storage) + mid, begin(Storage) + r + 1, point_cmp_z);
720 break;
721 default:
722 nth_element(begin(Storage) + l, begin(Storage) + mid, begin(Storage) + r + 1, point_cmp_x);
723 break;
724 }
725 (*root)->point = Storage[mid];
726 KD_TREE_NODE *left_son = nullptr, *right_son = nullptr;
727 BuildTree(&left_son, l, mid - 1, Storage);
728 BuildTree(&right_son, mid + 1, r, Storage);
729 (*root)->left_son_ptr = left_son;
730 (*root)->right_son_ptr = right_son;
731 Update((*root));
732 return;
733}
734
735template <typename PointType>
736void KD_TREE<PointType>::Rebuild(KD_TREE_NODE **root)

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected