R*-tree ChooseSubtree: navigate to the best leaf for this entry.
(
tree: &RTree,
node_idx: usize,
entry_bbox: &BoundingBox,
target_level: u32,
)
| 52 | |
| 53 | /// R*-tree ChooseSubtree: navigate to the best leaf for this entry. |
| 54 | fn choose_subtree( |
| 55 | tree: &RTree, |
| 56 | node_idx: usize, |
| 57 | entry_bbox: &BoundingBox, |
| 58 | target_level: u32, |
| 59 | ) -> usize { |
| 60 | let node = &tree.nodes[node_idx]; |
| 61 | if node.level == target_level { |
| 62 | return node_idx; |
| 63 | } |
| 64 | |
| 65 | match &node.kind { |
| 66 | NodeKind::Leaf { .. } => node_idx, |
| 67 | NodeKind::Internal { children } => { |
| 68 | if children.is_empty() { |
| 69 | return node_idx; |
| 70 | } |
| 71 | let best = if tree.nodes[children[0].node_idx].is_leaf() { |
| 72 | choose_least_overlap(children, entry_bbox) |
| 73 | } else { |
| 74 | choose_least_enlargement(children, entry_bbox) |
| 75 | }; |
| 76 | choose_subtree(tree, children[best].node_idx, entry_bbox, target_level) |
| 77 | } |
| 78 | } |
| 79 | } |
| 80 | |
| 81 | fn choose_least_enlargement(children: &[ChildRef], entry_bbox: &BoundingBox) -> usize { |
| 82 | let mut best = 0; |
no test coverage detected