public void insert(Node node) { if (!node.HasCollisionGroups() || !node.Active || !node.Collidable) return; if(!node.GetBoundingBox().Intersects(this.bounds)) return; if(nodes[0] != null) { int index = getIndex(node); if(index != -1) { nodes[index].insert(node); return; } } objects.Add(node); if(objects.Count > MAX_OBJECTS && level < MAX_LEVELS) { if(nodes[0] == null) split(); int i = 0; while(i < objects.Count) { int index = getIndex(objects.ElementAt(i)); if (index != -1) { Node nodeToMove = objects.ElementAt(i); nodes[index].insert(nodeToMove); objects.RemoveAt(i); } else i++; } } }
private int getIndex(Node node) { BoundingRectangle nodeRect = node.GetBoundingBox(); int index = -1; float verticleMidPoint = bounds.X + (bounds.Width / 2); float horizontalMidPoint = bounds.Y + (bounds.Height / 2); bool topQuadrant = nodeRect.Y < horizontalMidPoint && nodeRect.Y + nodeRect.Height < horizontalMidPoint; bool bottomQuadrant = nodeRect.Y > horizontalMidPoint; if (nodeRect.X < verticleMidPoint && nodeRect.X + nodeRect.Width < verticleMidPoint) { if (topQuadrant) index = 0; else if (bottomQuadrant) index = 3; } else if (nodeRect.X > verticleMidPoint) { if (topQuadrant) index = 1; else if (bottomQuadrant) index = 2; } return index; }