private void Remove(QuadtreeNode <T> node, T value) { if (node == null) { return; } if (!node.Intersects(value.Collider)) { return; } if (!node.IsLeaf()) { foreach (QuadtreeNode <T> child in node.children) { Remove(child, value); } } else { if (node.Remove(value)) { if (node.IsEmpty()) { Collapse(node); } } } }
private void Collapse(QuadtreeNode <T> node) { if (node.IsLeaf()) { if (node.parent != null && node.IsEmpty()) { Collapse(node.parent); } } else { bool empty = true; for (int i = 0; i < 4 && empty; i++) { if (!node.children[i].IsLeaf() || !node.children[i].IsEmpty()) { empty = false; } } if (empty) { node.children = new QuadtreeNode <T> [4]; if (node.parent != null) { Collapse(node.parent); } } } }