Exemple #1
0
        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++;
                }
            }
        }
Exemple #2
0
        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;
        }