Beispiel #1
0
        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)
                    {
                        switch (Partition(Span, n.Span))
                        {
                        case 1:     //quadrant 1
                            SubTrees[0].AddNode(n);
                            break;

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

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

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

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

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

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

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

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

                default:
                    node.Parent = this;
                    Nodes.Add(node);
                    break;
                }
            }
        }
Beispiel #2
0
 public Element(T value, AABB span)
 {
     Span   = span;
     Value  = value;
     Parent = null;
 }