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; } } }
public Element(T value, AABB span) { Span = span; Value = value; Parent = null; }