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