private void TraverseOverlapping(KdTreeNode <T> node, AaRect rect, Action <T> action) { if (node.type == NodeType.Leaf) { var holder = node.leaf.holder; while (holder != null) { if (AaRect.Overlaps(rect, holder.fitRect)) { action(holder.body); } holder = holder.sibling.next; } } else { var pos = node.DetermineInnerNodePosition(rect); if (pos != ChildPosition.More) { TraverseOverlapping(node.inner.nodeLess, rect, action); } if (pos != ChildPosition.Less) { TraverseOverlapping(node.inner.nodeMore, rect, action); } TraverseOverlapping(node.inner.nodeBoth, rect, action); } }