QuadTreeNode <T> DeepChild(EQuadrant quad) { QuadTreeNode <T> current = this; while (!current.IsLeaf()) { current = current.Child(quad); } return(current); }
QuadTreeNode <T> Neighbour(ESide direction, EQuadrant corner) { QuadTreeNode <T> quadnode = Neighbour(direction); if (quadnode == null) { return(null); } while (!quadnode.IsLeaf()) { quadnode = quadnode.Child(Reflect(direction, corner)); } return(quadnode); }
void Neighbours(ESide direction, IList <QuadTreeNode <T> > neighbours) { QuadTreeNode <T> quadnode = Neighbour(direction); if (quadnode != null) { if (quadnode.IsLeaf()) { neighbours.Add(quadnode); } else { quadnode.Children(Opposite(direction), neighbours); } } }
QuadTreeNode <T> Neighbour(ESide direction) { QuadTreeNode <T> neighbor = null; // Ascent the tree up to a common ancestor. if (_parent != null && Adjacent(direction, Quadrant())) { neighbor = _parent.Neighbour(direction); } else { neighbor = _parent; } // Backtrack mirroring the ascending moves. if (neighbor != null && !neighbor.IsLeaf()) { return(neighbor.Child(Reflect(direction, Quadrant()))); } else { return(neighbor); } }