Beispiel #1
0
        QuadTreeNode <T> DeepChild(EQuadrant quad)
        {
            QuadTreeNode <T> current = this;

            while (!current.IsLeaf())
            {
                current = current.Child(quad);
            }
            return(current);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
                }
            }
        }
Beispiel #4
0
        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);
            }
        }