Example #1
0
        private void Split(ARTreeContainer container, int level)
        {
            List<IRTreeContainer> result;
            var axis = ChooseSplitAxis(out result, container);
            ARTreeContainer container1;
            ARTreeContainer container2;

            if (!container.IsLeaf)
            {
                container1 = new RTreeNode();
                container2 = new RTreeNode();
            }
            else
            {
                container1 = new RTreeLeaf();
                container2 = new RTreeLeaf();

            }
            ChooseSplitIndex(result, axis, container1, container2);

            if (container.Parent == null)
            {
                var lower = _root.Lower;
                var upper = _root.Upper;
                var area = _root.Area;
                _root.Dispose();
                _root = null;
                _root = new RTreeNode(lower, upper) {Area = area};
                container1.Parent = _root;
                container2.Parent = _root;
                ((RTreeNode)_root).Children.Add(container1);
                ((RTreeNode)_root).Children.Add(container2);
                _levelForOverflowStrategy.Add(true);
            }
            else
            {
                container1.Parent = container.Parent;
                container2.Parent = container.Parent;

                ((RTreeNode)container.Parent).Children.Remove(container);
                ((RTreeNode)container.Parent).Children.Add(container1);
                ((RTreeNode)container.Parent).Children.Add(container2);

                container.Dispose();
                if (!container1.Parent.IsLeaf)
                {
                    if (((RTreeNode)container1.Parent).Children.Count > MaxCountOfNode)
                        OverflowTreatment(level - 1, container1.Parent);
                }
                else
                {
                    if (((RTreeLeaf)container2.Parent).Data.Count > MaxCountOfNode)
                        OverflowTreatment(level - 1, container2.Parent);
                }
            }
        }
Example #2
0
        private void LocalReorganisationByRemoving(ARTreeContainer rTree, int level)
        {
            if (rTree.Parent != null)
            {
                ((RTreeNode)rTree.Parent).Children.Remove(rTree);
                RecalculationByRemoving(rTree);
                var leafLevel = _levelForOverflowStrategy.Count - 1;
                if (((RTreeNode)rTree.Parent).Children.Count < MinCountOfNode)
                    LocalReorganisationByRemoving(rTree.Parent, level - 1);

                if (rTree is RTreeLeaf)
                {
                    foreach (var value in ((RTreeLeaf)rTree).Data)
                    {
                        var newLeafLeavel = _levelForOverflowStrategy.Count - 1;
                        Insert(value, level - (leafLevel - newLeafLeavel));
                    }

                }
                else
                {
                    foreach (var value in ((RTreeNode)rTree).Children)
                    {
                        var newLeafLeavel = _levelForOverflowStrategy.Count - 1;
                        Insert(value, level - (leafLevel - newLeafLeavel));
                    }

                }

                rTree.Dispose();
            }
            else
            {
                if (rTree is RTreeLeaf)
                {
                    if (((RTreeLeaf)rTree).Data.Count == 0)
                        for (int i = 0; i < _countOfR; i++)
                        {
                            rTree.Upper[i] = float.NegativeInfinity;
                            rTree.Lower[i] = float.PositiveInfinity;
                        }
                }
                else
                {
                    if (((RTreeNode)rTree).Children.Count == 1)
                    {
                        _root = ((RTreeNode)rTree).Children[0];
                        _root.Parent = null;
                        rTree.Dispose();
                        _levelForOverflowStrategy.RemoveAt(_levelForOverflowStrategy.Count - 1);
                    }
                }

            }
        }