//
        //You can use the following additional attributes as you write your tests:
        //
        //Use ClassInitialize to run code before running the first test in the class
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //Use ClassCleanup to run code after all tests in a class have run
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //Use TestInitialize to run code before running each test
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //Use TestCleanup to run code after each test has run
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion


        internal virtual IRTreeContainer CreateIRTreeContainer()
        {
            // TODO: Instantiate an appropriate concrete class.
            IRTreeContainer target = null;

            return(target);
        }
        public void ParentUnitTest()
        {
            Assert.Inconclusive("TODO");

            IRTreeContainer target   = CreateIRTreeContainer(); // TODO: Initialize to an appropriate value
            ARTreeContainer expected = null;                    // TODO: Initialize to an appropriate value
            ARTreeContainer actual;

            target.Parent = expected;
            actual        = target.Parent;
            Assert.AreEqual(expected, actual);
        }
示例#3
0
        private void RecalculationByRemoving(IRTreeContainer removeContainer)
        {
            var recalculatePath = removeContainer;

            while (recalculatePath.Parent != null)
            {
                if (recalculatePath.Parent.IsLeaf)
                {
                    var newMBR = FindMBR(((RTreeLeaf)recalculatePath.Parent).Data);
                    recalculatePath.Parent.Lower = newMBR.Lower;
                    recalculatePath.Parent.Upper = newMBR.Upper;
                    recalculatePath.Parent.Area = GetArea(newMBR);
                }
                else
                {
                    var newMBR = FindMBR(((RTreeNode)recalculatePath.Parent).Children);
                    recalculatePath.Parent.Lower = newMBR.Lower;
                    recalculatePath.Parent.Upper = newMBR.Upper;
                    recalculatePath.Parent.Area = GetArea(newMBR);

                }

                recalculatePath = recalculatePath.Parent;

                if (recalculatePath.Parent == null || recalculatePath.Parent.Inclusion(removeContainer))
                    break;

            }
        }
示例#4
0
        //recalculation
        private void Recalculation(IRTreeContainer newContainer)
        {
            var recalculatePath = newContainer;
            while (recalculatePath.Parent != null)
            {

                if (recalculatePath.Parent.Inclusion(newContainer))
                    break;

                var recalculateMBR = FindMBR(recalculatePath.Parent, newContainer);
                recalculatePath.Parent.Area = GetArea(recalculateMBR);
                recalculatePath.Parent.Lower = recalculateMBR.Lower;
                recalculatePath.Parent.Upper = recalculateMBR.Upper;
                recalculatePath = recalculatePath.Parent;
            }
        }
示例#5
0
        private void Insert(IRTreeContainer container, int level)
        {
            if (level == _levelForOverflowStrategy.Count - 1)
            {
                var chooseSubTree = (RTreeLeaf)ChooseSubTree(container, level);
                container.Parent = chooseSubTree;
                chooseSubTree.Data.Add((IRTreeDataContainer)container);
                Recalculation(container);
                if (chooseSubTree.Data.Count > MaxCountOfNode)
                {
                    OverflowTreatment(level, chooseSubTree);
                }
            }
            else
            {
                var chooseSubTree = (RTreeNode)ChooseSubTree(container, level);
                container.Parent = chooseSubTree;
                chooseSubTree.Children.Add((ARTreeContainer)container);
                Recalculation(container);

                if (chooseSubTree.Children.Count > MaxCountOfNode)
                {
                    OverflowTreatment(level, chooseSubTree);
                }
            }
        }
示例#6
0
        private ARTreeContainer GetNodeByAreaValue(List<ARTreeContainer> list, IRTreeContainer container)
        {
            float minAreaValue = float.PositiveInfinity;
            float minOldAreaValue = float.PositiveInfinity;
            ARTreeContainer areaRechtangle = null;
            foreach (var value in list)
            {
                var newMBR = FindMBR(value, container);
                var oldArea = value.Area;
                var enlargementArea = GetArea(newMBR) - oldArea;
                if (minAreaValue > enlargementArea)
                {
                    areaRechtangle = value;
                    minAreaValue = enlargementArea;
                    minOldAreaValue = oldArea;
                }
                else
                {
                    if (minAreaValue == enlargementArea && oldArea < minOldAreaValue)
                    {
                        areaRechtangle = value;
                        minOldAreaValue = oldArea;
                    }
                }
            }

            return areaRechtangle;
        }
示例#7
0
        private ARTreeContainer GetLeavesLevelByOverlap(List<ARTreeContainer> list, IRTreeContainer container)
        {
            ARTreeContainer output = null;
            IMBR currentOutputMBR = null;
            float minEnlagargmentOfOverlap = float.PositiveInfinity;

            foreach (var value in list)
            {
                var oldOverlap = 0.0f;
                var newOverlap = 0.0f;
                var newMBR = FindMBR(value, container);
                foreach (var value2 in list)
                {
                    if (value != value2)
                    {
                        oldOverlap += FindOverlapValue(value, value2);
                        newOverlap += FindOverlapValue(newMBR, value2);
                    }
                }

                var enlargagment = newOverlap - oldOverlap;
                if (enlargagment < minEnlagargmentOfOverlap)
                {
                    output = value;
                    minEnlagargmentOfOverlap = enlargagment;
                    currentOutputMBR = newMBR;
                }
                else
                {

                    if (enlargagment == minEnlagargmentOfOverlap)
                    {
                        var oldCurrentArea = value.Area;
                        var oldMinArea = output.Area;
                        var enlargementCurrentArea = GetArea(newMBR) - oldCurrentArea;
                        var enlargementMinArea = GetArea(currentOutputMBR) - oldMinArea;

                        if ((enlargementMinArea > enlargementCurrentArea) || (enlargementMinArea == enlargementCurrentArea && oldMinArea > oldCurrentArea))
                        {
                            output = value;
                            currentOutputMBR = newMBR;
                        }
                    }
                }

            }
            return output;
        }
示例#8
0
        private ARTreeContainer ChooseSubTree(IRTreeContainer container, int level)
        {
            if (_root.IsLeaf) return _root;
            var currentNode = (RTreeNode)_root;
            var counterOfLevel = 0;
            while (counterOfLevel < level)
            {
                if (counterOfLevel + 1 == level)
                {
                    return GetLeavesLevelByOverlap(currentNode.Children, container);
                }

                currentNode = (RTreeNode)GetNodeByAreaValue(currentNode.Children, container);
                counterOfLevel++;
            }
            return currentNode;
        }