| 677 | |
| 678 | template <typename PointType> |
| 679 | void 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 | |
| 735 | template <typename PointType> |
| 736 | void KD_TREE<PointType>::Rebuild(KD_TREE_NODE **root) |
nothing calls this directly
no outgoing calls
no test coverage detected