예제 #1
0
 public Element(T value, AABB span)
 {
     Span   = span;
     Value  = value;
     Parent = null;
 }
예제 #2
0
        /// <summary>
        /// Adds the specified node to the tree.
        /// </summary>
        /// <param name="node">The node to add</param>
        public void AddNode(Element <T> node)
        {
            if (!IsPartitioned)
            {
                if (Nodes.Count >= MaxBucket && MaxDepth > 0) //bin is full and can still subdivide
                {
                    //partition into quadrants and sort existing nodes amonst quads.
                    Nodes.Add(node); //treat new node just like other nodes for partitioning

                    SubTrees    = new QuadTree <T> [4];
                    SubTrees[0] = new QuadTree <T>(Span.Q1, MaxBucket, MaxDepth - 1);
                    SubTrees[1] = new QuadTree <T>(Span.Q2, MaxBucket, MaxDepth - 1);
                    SubTrees[2] = new QuadTree <T>(Span.Q3, MaxBucket, MaxDepth - 1);
                    SubTrees[3] = new QuadTree <T>(Span.Q4, MaxBucket, MaxDepth - 1);

                    List <Element <T> > remNodes = new List <Element <T> >();
                    //nodes that are not fully contained by any quadrant

                    foreach (Element <T> n in Nodes)
                    {
                        Quadrant quadrant = GetPartition(ref Span, ref n.Span);

                        switch (quadrant)
                        {
                        case Quadrant.TopRight:     //Quadrant 1
                            SubTrees[0].AddNode(n);
                            break;

                        case Quadrant.TopLeft:
                            SubTrees[1].AddNode(n);
                            break;

                        case Quadrant.BottomLeft:
                            SubTrees[2].AddNode(n);
                            break;

                        case Quadrant.BottomRight:
                            SubTrees[3].AddNode(n);
                            break;

                        default:
                            n.Parent = this;
                            remNodes.Add(n);
                            break;
                        }
                    }

                    Nodes = remNodes;
                }
                else
                {
                    //if bin is not yet full or max depth has been reached, just add the node without subdividing
                    node.Parent = this;
                    Nodes.Add(node);
                }
            }
            else //we already have children nodes
            {
                //add node to specific sub-tree
                switch (GetPartition(ref Span, ref node.Span))
                {
                case Quadrant.TopRight:     //quadrant 1
                    SubTrees[0].AddNode(node);
                    break;

                case Quadrant.TopLeft:
                    SubTrees[1].AddNode(node);
                    break;

                case Quadrant.BottomLeft:
                    SubTrees[2].AddNode(node);
                    break;

                case Quadrant.BottomRight:
                    SubTrees[3].AddNode(node);
                    break;

                default:
                    node.Parent = this;
                    Nodes.Add(node);
                    break;
                }
            }
        }
예제 #3
0
 public Element(AABB span)
 {
     Span   = span;
     Value  = default(T);
     Parent = null;
 }