Пример #1
0
        //private Int32 _tempSplitCount = 0;
        public void Insert(IExtents bounds,
                           TItem entry,
                           ISpatialIndexNode <IExtents, TItem> node,
                           INodeSplitStrategy <IExtents, TItem> nodeSplitStrategy,
                           IndexBalanceHeuristic heuristic,
                           out ISpatialIndexNode <IExtents, TItem> newSiblingFromSplit)
        {
            newSiblingFromSplit = null;

            // Terminating case
            if (node.IsLeaf)
            {
                node.Add(entry);

                // Handle node overflow
                if (node.ItemCount > heuristic.NodeItemMaximumCount)
                {
                    // Split the node using the given strategy
                    newSiblingFromSplit = nodeSplitStrategy.SplitNode(node, heuristic);

                    //if (++_tempSplitCount % 100 == 0)
                    //{
                    //    Debug.Print("Node split # {0}", _tempSplitCount);
                    //}
                }
            }
            else
            {
                // NOTE: Descending the tree recursively here
                // can make for a very expensive build of a tree,
                // even for moderate amounts of data.

                Double leastExpandedArea      = Double.MaxValue;
                Double leastExpandedChildArea = Double.MaxValue;

                ComputationExtents currentBounds = new ComputationExtents(bounds);

                ISpatialIndexNode <IExtents, TItem> leastExpandedChild;
                leastExpandedChild = findLeastExpandedChild(node.SubNodes,
                                                            currentBounds,
                                                            leastExpandedArea,
                                                            leastExpandedChildArea);

                Debug.Assert(leastExpandedChild != null);

                // Found least expanded child node - insert into it
                Insert(bounds, entry, leastExpandedChild, nodeSplitStrategy,
                       heuristic, out newSiblingFromSplit);

                RTreeNode <TItem> rNode = node as RTreeNode <TItem>;

                // Adjust this node...
                rNode.Bounds.ExpandToInclude(bounds);

                // Check for overflow and add to current node if it occured
                if (newSiblingFromSplit != null)
                {
                    // Add new sibling node to the current node
                    node.Add(newSiblingFromSplit);
                    newSiblingFromSplit = null;

                    // Split the current node, since the child count is too high,
                    // and return the split to the caller
                    if (node.SubNodeCount > heuristic.NodeItemMaximumCount)
                    {
                        newSiblingFromSplit = nodeSplitStrategy.SplitNode(node, heuristic);
                    }
                }
            }
        }