public void TestRemoveNonExistent()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 20, 20);

            Delete(10, 61, 1, 1, tree);
            Set(10, 60, 1, 1, "R1", tree);
            Delete(10, 61, 1, 1, tree);
            Set(10, 80, 1, 1, "R2", tree);
            Set(20, 70, 1, 1, "R3", tree);
            Set(10, 80, 1, 1, "R4", tree);
            AssertCollectAll(tree, "R1,R3,R4");

            Assert.AreEqual(3, NavigateLeaf(tree, "").Count);
            Assert.AreEqual(3, NavigateLeaf(tree, "").Count);
            AssertCollectAll(tree, "R1,R3,R4");

            Delete(10, 61, 1, 1, tree);
            Assert.AreEqual(3, NavigateLeaf(tree, "").Count);
            AssertCollectAll(tree, "R1,R3,R4");

            Delete(9, 60, 1, 1, tree);
            Delete(10, 80, 1, 1, tree);
            Assert.AreEqual(2, NavigateLeaf(tree, "").Count);
            AssertCollectAll(tree, "R1,R3");

            Delete(9, 60, 1, 1, tree);
            Delete(10, 80, 1, 1, tree);
            Delete(10, 60, 1, 1, tree);
            Assert.AreEqual(1, NavigateLeaf(tree, "").Count);
            AssertCollectAll(tree, "R3");

            Delete(20, 70, 1, 1, tree);
            Assert.AreEqual(0, NavigateLeaf(tree, "").Count);
            AssertCollectAll(tree, "");
        }
Example #2
0
        public void TestFewValues()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100);

            Set(73.32704983331149, 23.46990952575032, 1, 1, "R0", tree);
            Set(53.09747562396894, 17.100976152185034, 1, 1, "R1", tree);
            Set(56.75757294858788, 25.508506696809608, 1, 1, "R2", tree);
            Set(83.66639067675291, 76.53772974832937, 1, 1, "R3", tree);
            Set(51.01654641861326, 43.49009281983866, 1, 1, "R4", tree);

            var beginX = 50.45945198254618;
            var endX   = 88.31594559038719;

            var beginY = 4.577595744501329;
            var endY   = 22.93393078279351;

            AssertCollect(tree, beginX, beginY, endX - beginX, endY - beginY, "R1");
            AssertCollectAll(tree, "R0,R1,R2,R3,R4");

            Assert.AreEqual("R0", Get(73.32704983331149, 23.46990952575032, 1, 1, tree));
            Assert.AreEqual("R1", Get(53.09747562396894, 17.100976152185034, 1, 1, tree));
            Assert.AreEqual("R2", Get(56.75757294858788, 25.508506696809608, 1, 1, tree));
            Assert.AreEqual("R3", Get(83.66639067675291, 76.53772974832937, 1, 1, tree));
            Assert.AreEqual("R4", Get(51.01654641861326, 43.49009281983866, 1, 1, tree));
        }
        public void TestAddRemoveScenario()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100);

            AddUnique(tree, 85.0, 65.0, 0.999, 0.999, "P3");
            AddUnique(tree, 86.0, 50.0, 0.999, 0.999, "P6");
            AddUnique(tree, 17.0, 84.0, 0.999, 0.999, "P0");
            AddUnique(tree, 7.0, 34.0, 0.999, 0.999, "P4");
            AddUnique(tree, 7.0, 69.0, 0.999, 0.999, "P8");
            AddUnique(tree, 36.0, 47.0, 0.999, 0.999, "P9");
            AddUnique(tree, 62.0, 50.0, 0.999, 0.999, "P1");
            AddUnique(tree, 46.0, 17.0, 0.999, 0.999, "P2");
            AddUnique(tree, 43.0, 16.0, 0.999, 0.999, "P5");
            AddUnique(tree, 79.0, 92.0, 0.999, 0.999, "P7");
            Remove(tree, 46.0, 17.0, 0.999, 0.999, "P2");
            AddUnique(tree, 47.0, 17.0, 0.999, 0.999, "P2");
            Remove(tree, 43.0, 16.0, 0.999, 0.999, "P5");
            AddUnique(tree, 44.0, 16.0, 0.999, 0.999, "P5");
            Remove(tree, 62.0, 50.0, 0.999, 0.999, "P1");
            AddUnique(tree, 62.0, 49.0, 0.999, 0.999, "P1");
            Remove(tree, 17.0, 84.0, 0.999, 0.999, "P0");
            AddUnique(tree, 18.0, 84.0, 0.999, 0.999, "P0");
            Remove(tree, 86.0, 50.0, 0.999, 0.999, "P6");
            AddUnique(tree, 86.0, 51.0, 0.999, 0.999, "P6");
            AssertFound(tree, 81.0, 46.0, 10.0, 10.0, "P6");
        }
        public void TestPoints()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 10, 10);

            AddNonUnique(tree, 8.0, 4.0, 1, 1, "R0");
            AssertFound(tree, 0, 0, 10, 10, "R0");

            AddNonUnique(tree, 8.0, 1.0, 1, 1, "R1");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1");

            AddNonUnique(tree, 8.0, 2.0, 1, 1, "R2");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1,R2");

            AddNonUnique(tree, 4.0, 4.0, 1, 1, "R3");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1,R2,R3");

            AddNonUnique(tree, 1.0, 9.0, 1, 1, "R4");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1,R2,R3,R4");

            AddNonUnique(tree, 8.0, 3.0, 1, 1, "R5");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1,R2,R3,R4,R5");

            AddNonUnique(tree, 0.0, 6.0, 1, 1, "R6");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1,R2,R3,R4,R5,R6");

            AddNonUnique(tree, 5.0, 1.0, 1, 1, "R7");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1,R2,R3,R4,R5,R6,R7");

            AddNonUnique(tree, 5.0, 8.0, 1, 1, "R8");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1,R2,R3,R4,R5,R6,R7,R8");

            AddNonUnique(tree, 7.0, 6.0, 1, 1, "R9");
            AssertFound(tree, 0, 0, 10, 10, "R0,R1,R2,R3,R4,R5,R6,R7,R8,R9");
        }
        public void TestDimension()
        {
            var tree = MXCIFQuadTreeFactory.Make(1000, 100000, 9000, 900000);

            try
            {
                Set(10, 90, 1, 1, "R1", tree);
                Assert.Fail();
            }
            catch (Exception ex)
            {
                Assert.AreEqual(ex.Message, "Rectangle (10.0d,90.0d,1.0d,1.0d) not in {MinX=1000.0d, MinY=100000.0d, MaxX=10000.0d, MaxY=1000000.0d}");
            }

            try
            {
                Set(10999999, 90, 1, 1, "R2", tree);
                Assert.Fail();
            }
            catch (Exception)
            {
                // expected
            }

            Set(5000, 800000, 1, 1, "R3", tree);

            AssertCollect(tree, 0, 0, 10000000, 10000000, "R3");
            AssertCollect(tree, 4000, 790000, 1200, 11000, "R3");
            AssertCollect(tree, 4000, 790000, 900, 9000, "");
            AssertCollectAll(tree, "R3");
        }
Example #6
0
        public void TestPoints()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 10, 10);

            Set(8.0, 4.0, 1, 1, "R0", tree);
            AssertCollectAll(tree, "R0");

            Set(8.0, 1.0, 1, 1, "R1", tree);
            AssertCollectAll(tree, "R0,R1");

            Set(8.0, 2.0, 1, 1, "R2", tree);
            AssertCollectAll(tree, "R0,R1,R2");

            Set(4.0, 4.0, 1, 1, "R3", tree);
            AssertCollectAll(tree, "R0,R1,R2,R3");

            Set(1.0, 9.0, 1, 1, "R4", tree);
            AssertCollectAll(tree, "R0,R1,R2,R3,R4");

            Set(8.0, 3.0, 1, 1, "R5", tree);
            AssertCollectAll(tree, "R0,R1,R2,R3,R4,R5");

            Set(0.0, 6.0, 1, 1, "R6", tree);
            AssertCollectAll(tree, "R0,R1,R2,R3,R4,R5,R6");

            Set(5.0, 1.0, 1, 1, "R7", tree);
            AssertCollectAll(tree, "R0,R1,R2,R3,R4,R5,R6,R7");

            Set(5.0, 8.0, 1, 1, "R8", tree);
            AssertCollectAll(tree, "R0,R1,R2,R3,R4,R5,R6,R7,R8");

            Set(7.0, 6.0, 1, 1, "R9", tree);
            AssertCollectAll(tree, "R0,R1,R2,R3,R4,R5,R6,R7,R8,R9");
        }
        public void TestSubdivideAdd()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 2, 3);

            AddNonUnique(tree, 0, 0, 10, 10, "R1");
            AddNonUnique(tree, 0, 0, 10, 10, "R2");
            AddNonUnique(tree, 0, 0, 10, 10, "R3");
            Assert.AreEqual(3, NavigateLeaf(tree, "nw,nw").Count);
        }
        public void TestAddRemoveSimple()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 50, 60);
            AssertFound(tree, 0, 0, 10, 10, "");

            AddNonUnique(tree, 5, 8, 1, 1, "R1");
            AssertFound(tree, 0, 0, 10, 10, "R1");
            AssertFound(tree, 0, 0, 5, 5, "");

            MXCIFQuadTreeRowIndexRemove.Remove(5, 8, 1, 1, "R1", tree);
            AssertFound(tree, 0, 0, 10, 10, "");
        }
Example #9
0
        public override EventTable Make(
            EventAdvancedIndexConfigStatement configStatement,
            AdvancedIndexConfigContextPartition configCP,
            EventTableOrganization organization)
        {
            var qt       = (AdvancedIndexConfigContextPartitionQuadTree)configCP;
            var quadTree =
                MXCIFQuadTreeFactory <object> .Make(qt.X, qt.Y, qt.Width, qt.Height, qt.LeafCapacity, qt.MaxTreeHeight);

            return(new EventTableQuadTreeMXCIFImpl(organization,
                                                   (AdvancedIndexConfigStatementMXCIFQuadtree)configStatement, quadTree));
        }
        public void TestDimension()
        {
            var tree = MXCIFQuadTreeFactory.Make(1000, 100000, 9000, 900000);

            Assert.IsFalse(AddNonUnique(tree, 10, 90, 1, 1, "R1"));
            Assert.IsFalse(AddNonUnique(tree, 10999999, 90, 1, 1, "R2"));
            Assert.IsTrue(AddNonUnique(tree, 5000, 800000, 1, 1, "R3"));

            AssertFound(tree, 0, 0, 10000000, 10000000, "R3");
            AssertFound(tree, 4000, 790000, 1200, 11000, "R3");
            AssertFound(tree, 4000, 790000, 900, 9000, "");
        }
 public FilterParamIndexQuadTreeMXCIF(IReaderWriterLock readWriteLock, FilterSpecLookupable lookupable)
     : base(FilterOperator.ADVANCED_INDEX, lookupable)
 {
     _readWriteLock = readWriteLock;
     _advancedIndex = (FilterSpecLookupableAdvancedIndex) lookupable;
     var quadTreeConfig = _advancedIndex.QuadTreeConfig;
     _quadTree = MXCIFQuadTreeFactory<object>.Make(
         quadTreeConfig.X, 
         quadTreeConfig.Y, 
         quadTreeConfig.Width, 
         quadTreeConfig.Height);
 }
        public void TestSuperslim()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 1, 100);

            AddNonUnique(tree, 10, 90, 1, 1, "R1");
            AddNonUnique(tree, 10, 95, 1, 1, "R2");
            var ne = NavigateLeaf(tree, "sw,sw,sw,ne");

            Compare(10, 90, 1, 1, "\"R1\"", (XYWHRectangleMultiType)ne.Data);
            var se = NavigateLeaf(tree, "sw,sw,sw,se");

            Compare(10, 95, 1, 1, "\"R2\"", (XYWHRectangleMultiType)se.Data);
        }
        public void TestSuperslim()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 1, 100);

            Set(10, 90, 0.1, 0.2, "R1", tree);
            Set(10, 95, 0.3, 0.4, "R2", tree);
            var ne = NavigateLeaf(tree, "sw,sw,sw,ne");

            Compare(10, 90, 0.1, 0.2, "R1", (XYWHRectangleWValue)ne.Data);
            var se = NavigateLeaf(tree, "sw,sw,sw,se");

            Compare(10, 95, 0.3, 0.4, "R2", (XYWHRectangleWValue)se.Data);
        }
        public void TestSubdivideAddMany()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 2, 3);

            Set(0, 0, 1, 1, "R1", tree);
            Set(1, 2, 1, 1, "R2", tree);
            Set(3, 2, 1, 1, "R3", tree);
            Assert.AreEqual(3, NavigateLeaf(tree, "nw,nw").Count);

            Delete(1, 2, 1, 1, tree);
            Delete(0, 0, 1, 1, tree);
            Delete(3, 2, 1, 1, tree);
            AssertCollectAll(tree, "");
        }
Example #15
0
        public void TestGetSetRemove()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100);
            Assert.IsNull(Get(10, 20, 30, 40, tree));
            AssertCollectAll(tree, "");

            Set(10, 20, 30, 40, "R0", tree);
            Assert.AreEqual("R0", Get(10, 20, 30, 40, tree));
            AssertCollectAll(tree, "R0");

            Delete(10, 20, 30, 40, tree);
            Assert.IsNull(Get(10, 20, 30, 40, tree));
            AssertCollectAll(tree, "");
        }
        public void TestAddRemoveSamePoint()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100);

            AddNonUnique(tree, 5, 8, 1, 1, "R1");
            AddNonUnique(tree, 5, 8, 1, 1, "R2");
            AssertFound(tree, 0, 0, 10, 10, "R1,R2");

            MXCIFQuadTreeRowIndexRemove.Remove(5, 8, 1, 1, "R1", tree);
            AssertFound(tree, 0, 0, 10, 10, "R2");

            MXCIFQuadTreeRowIndexRemove.Remove(5, 8, 1, 1, "R2", tree);
            AssertFound(tree, 0, 0, 10, 10, "");
        }
Example #17
0
        public void TestSetRemoveTwiceSamePoint()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100);

            Set(5, 8, 1, 2, "R1", tree);
            Set(5, 8, 1, 2, "R2", tree);
            AssertCollectAll(tree, "R2");

            Delete(5, 8, 1, 2, tree);
            AssertCollectAll(tree, "");

            Delete(5, 8, 1, 2, tree);
            AssertCollectAll(tree, "");
        }
        public void TestSubdivideMultiChild()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 4, 3);

            Set(60, 11, 1, 1, "R1", tree);
            Set(60, 40, 1, 1, "R2", tree);
            Set(70, 30, 1, 1, "R3", tree);
            Set(60, 10, 1, 1, "R4", tree);
            Set(90, 45, 1, 1, "R5", tree);

            NavigateLeaf(tree, "nw");
            NavigateLeaf(tree, "se");
            NavigateLeaf(tree, "sw");
            var ne = NavigateBranch(tree, "ne");

            Assert.AreEqual(2, ne.Level);

            var nw         = NavigateLeaf(ne, "nw");
            var collection = (IList <XYWHRectangleWValue>)nw.Data;

            Compare(60, 11, 1, 1, "R1", collection[0]);
            Compare(60, 10, 1, 1, "R4", collection[1]);
            Assert.AreEqual(2, nw.Count);

            var se = NavigateLeaf(ne, "se");

            Compare(90, 45, 1, 1, "R5", (XYWHRectangleWValue)se.Data);
            Assert.AreEqual(1, se.Count);

            var sw = NavigateLeaf(ne, "sw");

            collection = (IList <XYWHRectangleWValue>)sw.Data;
            Compare(60, 40, 1, 1, "R2", collection[0]);
            Compare(70, 30, 1, 1, "R3", collection[1]);
            Assert.AreEqual(2, sw.Count);

            Delete(60, 11, 1, 1, tree);
            Delete(60, 40, 1, 1, tree);

            var root = NavigateLeaf(tree, "");

            collection = (IList <XYWHRectangleWValue>)root.Data;
            Assert.AreEqual(3, root.Count);
            Assert.AreEqual(3, collection.Count);
            Compare(60, 10, 1, 1, "R4", collection[0]);
            Compare(70, 30, 1, 1, "R3", collection[1]);
            Compare(90, 45, 1, 1, "R5", collection[2]);
        }
        public void TestSubdivideMultiChild()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 4, 3);

            AddNonUnique(tree, 60, 10, 1, 1, "R1");
            AddNonUnique(tree, 60, 40, 1, 1, "R2");
            AddNonUnique(tree, 70, 30, 1, 1, "R3");
            AddNonUnique(tree, 60, 10, 1, 1, "R4");
            AddNonUnique(tree, 90, 45, 1, 1, "R5");

            NavigateLeaf(tree, "nw");
            NavigateLeaf(tree, "se");
            NavigateLeaf(tree, "sw");
            var ne = NavigateBranch(tree, "ne");

            Assert.AreEqual(2, ne.Level);

            var nw = NavigateLeaf(ne, "nw");

            Compare(60, 10, 1, 1, "[\"R1\", \"R4\"]", (XYWHRectangleMultiType)nw.Data);
            Assert.AreEqual(2, nw.Count);

            var se = NavigateLeaf(ne, "se");

            Compare(90, 45, 1, 1, "\"R5\"", (XYWHRectangleMultiType)se.Data);
            Assert.AreEqual(1, se.Count);

            var sw         = NavigateLeaf(ne, "sw");
            var collection = sw.Data.UnwrapIntoList <XYWHRectangleMultiType>();

            Compare(60, 40, 1, 1, "\"R2\"", collection[0]);
            Compare(70, 30, 1, 1, "\"R3\"", collection[1]);
            Assert.AreEqual(2, sw.Count);

            Remove(tree, 60, 10, 1, 1, "R1");
            Remove(tree, 60, 40, 1, 1, "R2");

            var root = NavigateLeaf(tree, "");

            collection = root.Data.UnwrapIntoList <XYWHRectangleMultiType>();
            Assert.AreEqual(3, root.Count);
            Assert.AreEqual(3, collection.Count);
            Compare(60, 10, 1, 1, "[\"R4\"]", collection[0]);
            Compare(70, 30, 1, 1, "\"R3\"", collection[1]);
            Compare(90, 45, 1, 1, "\"R5\"", collection[2]);
        }
        public void TestFewValues()
        {
            tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100);

            AddNonUnique(tree, 73.32704983331149, 23.46990952575032, 1, 1, "R0");
            AddNonUnique(tree, 53.09747562396894, 17.100976152185034, 1, 1, "R1");
            AddNonUnique(tree, 56.75757294858788, 25.508506696809608, 1, 1, "R2");
            AddNonUnique(tree, 83.66639067675291, 76.53772974832937, 1, 1, "R3");
            AddNonUnique(tree, 51.01654641861326, 43.49009281983866, 1, 1, "R4");

            double beginX = 50.45945198254618;
            double endX   = 88.31594559038719;

            double beginY = 4.577595744501329;
            double endY   = 22.93393078279351;

            AssertFound(tree, beginX, beginY, endX - beginX, endY - beginY, "R1");
        }
        public void TestSubdivideSingleMerge()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 3, 2);

            Set(65, 75, 1, 1, "R1", tree);
            Set(81, 60, 1, 1, "R2", tree);
            Set(80, 60, 1, 1, "R3", tree);
            Set(80, 61, 1, 1, "R4", tree);
            AssertCollect(tree, 60, 60, 20.5, 20.5, "R1,R3,R4");
            AssertCollectAll(tree, "R1,R2,R3,R4");

            Assert.IsFalse(tree.Root is MXCIFQuadTreeNodeLeaf);
            Assert.AreEqual(4, NavigateLeaf(tree, "se").Count);
            var collection = (IList <XYWHRectangleWValue>)NavigateLeaf(tree, "se").Data;

            Assert.AreEqual(4, collection.Count);
            Compare(65, 75, 1, 1, "R1", collection[0]);
            Compare(81, 60, 1, 1, "R2", collection[1]);
            Compare(80, 60, 1, 1, "R3", collection[2]);
            Compare(80, 61, 1, 1, "R4", collection[3]);

            Set(66, 78, 1, 1, "R5", tree);
            Delete(65, 75, 1, 1, tree);
            Delete(80, 60, 1, 1, tree);

            Assert.AreEqual(3, NavigateLeaf(tree, "se").Count);
            AssertCollectAll(tree, "R2,R4,R5");
            Assert.AreEqual(3, collection.Count);
            Compare(81, 60, 1, 1, "R2", collection[0]);
            Compare(80, 61, 1, 1, "R4", collection[1]);
            Compare(66, 78, 1, 1, "R5", collection[2]);

            Delete(66, 78, 1, 1, tree);

            AssertCollectAll(tree, "R2,R4");
            Assert.AreEqual(2, NavigateLeaf(tree, "").Count);
            collection = (IList <XYWHRectangleWValue>)NavigateLeaf(tree, "").Data;
            Assert.AreEqual(2, collection.Count);
            Compare(81, 60, 1, 1, "R2", collection[0]);
            Compare(80, 61, 1, 1, "R4", collection[1]);
        }
        public void TestSubdivideSingleMerge()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 3, 2);

            AddNonUnique(tree, 65, 75, 1, 1, "P1");
            AddNonUnique(tree, 80, 75, 1, 1, "P2");
            AddNonUnique(tree, 80, 60, 1, 1, "P3");
            AddNonUnique(tree, 80, 60, 1, 1, "P4");
            AssertFound(tree, 60, 60, 21, 21, "P1,P2,P3,P4");

            Assert.IsFalse(tree.Root is MXCIFQuadTreeNodeLeaf);
            Assert.AreEqual(4, NavigateLeaf(tree, "se").Count);
            var collection = NavigateLeaf(tree, "se").Data.UnwrapIntoList <XYWHRectangleMultiType>();

            Assert.AreEqual(3, collection.Count);
            Compare(65, 75, 1, 1, "\"P1\"", collection[0]);
            Compare(80, 75, 1, 1, "\"P2\"", collection[1]);
            Compare(80, 60, 1, 1, "[\"P3\", \"P4\"]", collection[2]);

            AddNonUnique(tree, 66, 78, 1, 1, "P5");
            Remove(tree, 65, 75, 1, 1, "P1");
            Remove(tree, 80, 60, 1, 1, "P3");

            collection = NavigateLeaf(tree, "se").Data.UnwrapIntoList <XYWHRectangleMultiType>();
            Assert.AreEqual(3, NavigateLeaf(tree, "se").Count);
            AssertFound(tree, 60, 60, 21, 21, "P2,P4,P5");
            Assert.AreEqual(3, collection.Count);
            Compare(80, 75, 1, 1, "\"P2\"", collection[0]);
            Compare(80, 60, 1, 1, "[\"P4\"]", collection[1]);
            Compare(66, 78, 1, 1, "\"P5\"", collection[2]);

            Remove(tree, 66, 78, 1, 1, "P5");

            AssertFound(tree, 60, 60, 21, 21, "P2,P4");
            Assert.AreEqual(2, NavigateLeaf(tree, "").Count);
            collection = NavigateLeaf(tree, "").Data.UnwrapIntoList <XYWHRectangleMultiType>();
            Assert.AreEqual(2, collection.Count);
            Compare(80, 75, 1, 1, "\"P2\"", collection[0]);
            Compare(80, 60, 1, 1, "[\"P4\"]", collection[1]);
        }
        public void TestRemoveNonExistent()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 20, 20);

            Remove(tree, 10, 61, 1, 1, "R1");
            AddNonUnique(tree, 10, 60, 1, 1, "R1");
            Remove(tree, 10, 61, 1, 1, "R1");
            Remove(tree, 10, 60, 2, 1, "R1");
            Remove(tree, 10, 60, 1, 2, "R1");
            Remove(tree, 11, 60, 1, 1, "R1");
            AddNonUnique(tree, 10, 80, 1, 1, "R2");
            AddNonUnique(tree, 20, 70, 1, 1, "R3");
            AddNonUnique(tree, 10, 80, 1, 1, "R4");
            Assert.AreEqual(4, NavigateLeaf(tree, "").Count);
            AssertFound(tree, 10, 60, 10000, 10000, "R1,R2,R3,R4");

            Remove(tree, 10, 61, 1, 1, "R1");
            Remove(tree, 9, 60, 1, 1, "R1");
            Remove(tree, 10, 60, 1, 1, "R2");
            Remove(tree, 10, 80, 1, 1, "R1");
            Assert.AreEqual(4, NavigateLeaf(tree, "").Count);
            AssertFound(tree, 10, 60, 10000, 10000, "R1,R2,R3,R4");

            Remove(tree, 10, 80, 1, 1, "R4");
            Assert.AreEqual(3, NavigateLeaf(tree, "").Count);
            AssertFound(tree, 10, 60, 10000, 10000, "R1,R2,R3");

            Remove(tree, 10, 80, 1, 1, "R2");
            Assert.AreEqual(2, NavigateLeaf(tree, "").Count);
            AssertFound(tree, 10, 60, 10000, 10000, "R1,R3");

            Remove(tree, 10, 60, 1, 1, "R1");
            Assert.AreEqual(1, NavigateLeaf(tree, "").Count);
            AssertFound(tree, 10, 60, 10000, 10000, "R3");

            Remove(tree, 20, 70, 1, 1, "R3");
            Assert.AreEqual(0, NavigateLeaf(tree, "").Count);
            AssertFound(tree, 10, 60, 10000, 10000, "");
        }
        public void TestSubdivideMultitypeMerge()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 6, 2);

            Assert.AreEqual(1, tree.Root.Level);
            AddNonUnique(tree, 10, 10, 0, 0, "P1");
            AddNonUnique(tree, 9.9, 10, 0, 0, "P2");
            AddNonUnique(tree, 10, 9.9, 0, 0, "P3");
            AddNonUnique(tree, 10, 10, 0, 0, "P4");
            AddNonUnique(tree, 10, 9.9, 0, 0, "P5");
            AddNonUnique(tree, 9.9, 10, 0, 0, "P6");
            Assert.IsInstanceOf <MXCIFQuadTreeNodeLeaf>(tree.Root);
            AssertFound(tree, 9, 10, 0.99, 0.99, "P2,P6");
            AssertFound(tree, 10, 9, 0.99, 0.99, "P3,P5");
            AssertFound(tree, 10, 10, 0, 0, "P1,P4");
            AssertFound(tree, 9, 9, 2, 2, "P1,P2,P3,P4,P5,P6");

            AddNonUnique(tree, 10, 10, 0, 0, "P7");

            Assert.IsNotInstanceOf <MXCIFQuadTreeNodeLeaf>(tree.Root);
            Assert.AreEqual(1, tree.Root.Level);
            Assert.AreEqual(7, NavigateLeaf(tree, "nw").Count);
            var collection = NavigateLeaf(tree, "nw").Data.UnwrapIntoList <XYWHRectangleMultiType>();

            Assert.AreEqual(3, collection.Count);
            Compare(10, 10, 0, 0, "[\"P1\", \"P4\", \"P7\"]", collection[0]);
            Compare(9.9, 10, 0, 0, "[\"P2\", \"P6\"]", collection[1]);
            Compare(10, 9.9, 0, 0, "[\"P3\", \"P5\"]", collection[2]);
            AssertFound(tree, 9, 10, 0.99, 0.99, "P2,P6");
            AssertFound(tree, 10, 9, 0.99, 0.99, "P3,P5");
            AssertFound(tree, 10, 10, 0, 0, "P1,P4,P7");
            AssertFound(tree, 9, 9, 2, 2, "P1,P2,P3,P4,P5,P6,P7");

            AddNonUnique(tree, 9.9, 10, 0, 0, "P8");
            AddNonUnique(tree, 10, 9.9, 0, 0, "P9");
            AddNonUnique(tree, 10, 10, 0, 0, "P10");
            AddNonUnique(tree, 10, 10, 0, 0, "P11");
            AddNonUnique(tree, 10, 10, 0, 0, "P12");

            Assert.AreEqual(12, NavigateLeaf(tree, "nw").Count);
            Assert.AreEqual(2, NavigateLeaf(tree, "nw").Level);
            Assert.AreEqual(3, collection.Count);
            Compare(10, 10, 0, 0, "[\"P1\", \"P4\", \"P7\", \"P10\", \"P11\", \"P12\"]", collection[0]);
            Compare(9.9, 10, 0, 0, "[\"P2\", \"P6\", \"P8\"]", collection[1]);
            Compare(10, 9.9, 0, 0, "[\"P3\", \"P5\", \"P9\"]", collection[2]);
            AssertFound(tree, 9, 10, 0.99, 0.99, "P2,P6,P8");
            AssertFound(tree, 10, 9, 0.99, 0.99, "P3,P5,P9");
            AssertFound(tree, 10, 10, 1, 1, "P1,P4,P7,P10,P11,P12");
            AssertFound(tree, 9, 9, 2, 2, "P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12");

            Remove(tree, 9.9, 10, 0, 0, "P8");
            Remove(tree, 10, 9.9, 0, 0, "P3");
            Remove(tree, 10, 9.9, 0, 0, "P5");
            Remove(tree, 10, 9.9, 0, 0, "P9");
            AssertFound(tree, 9, 10, 0.99, 0.99, "P2,P6");
            AssertFound(tree, 10, 9, 0.99, 0.99, "");
            AssertFound(tree, 10, 10, 1, 1, "P1,P4,P7,P10,P11,P12");
            AssertFound(tree, 9, 9, 2, 2, "P1,P2,P4,P6,P7,P10,P11,P12");

            collection = NavigateLeaf(tree, "nw").Data.UnwrapIntoList <XYWHRectangleMultiType>();
            Assert.AreEqual(8, NavigateLeaf(tree, "nw").Count);
            Assert.AreEqual(2, collection.Count);
            Compare(10, 10, 0, 0, "[\"P1\", \"P4\", \"P7\", \"P10\", \"P11\", \"P12\"]", collection[0]);
            Compare(9.9, 10, 0, 0, "[\"P2\", \"P6\"]", collection[1]);
            Assert.IsFalse(tree.Root is MXCIFQuadTreeNodeLeaf);

            Remove(tree, 9.9, 10, 0, 0, "P2");
            Remove(tree, 10, 10, 0, 0, "P1");
            Remove(tree, 10, 10, 0, 0, "P10");
            Assert.IsInstanceOf <MXCIFQuadTreeNodeLeaf>(tree.Root);
            Assert.AreEqual(5, NavigateLeaf(tree, "").Count);
            collection = NavigateLeaf(tree, "").Data.UnwrapIntoList <XYWHRectangleMultiType>();
            Assert.AreEqual(2, collection.Count);
            Compare(10, 10, 0, 0, "[\"P4\", \"P7\", \"P11\", \"P12\"]", collection[0]);
            Compare(9.9, 10, 0, 0, "[\"P6\"]", collection[1]);
            AssertFound(tree, 9, 10, 0.99, 0.99, "P6");
            AssertFound(tree, 10, 9, 0.99, 0.99, "");
            AssertFound(tree, 10, 10, 1, 1, "P4,P7,P11,P12");
            AssertFound(tree, 9, 9, 2, 2, "P4,P6,P7,P11,P12");
        }
        public void TestSubdivideMerge()
        {
            var tree = MXCIFQuadTreeFactory.Make(0, 0, 100, 100, 3, 2);

            Assert.AreEqual(1, tree.Root.Level);
            Set(10, 10, 0.01, 0.01, "R1", tree);
            Set(9.9, 10, 0.01, 0.01, "R2", tree);
            Set(10, 9.9, 0.01, 0.01, "R3", tree);
            Set(10, 10, 0.01, 0.01, "R4", tree);
            Set(10, 9.9, 0.01, 0.01, "R5", tree);
            Set(9.9, 10, 0.01, 0.01, "R6", tree);
            Assert.IsInstanceOf <MXCIFQuadTreeNodeLeaf>(tree.Root);
            AssertCollect(tree, 9, 10, 1, 1, "R4,R6");
            AssertCollect(tree, 10, 9, 1, 1, "R4,R5");
            AssertCollect(tree, 10, 10, 1, 1, "R4");
            AssertCollect(tree, 9, 9, 2, 2, "R4,R5,R6");
            AssertCollectAll(tree, "R4,R5,R6");

            Set(10, 10, 0.01, 0.01, "R7", tree);
            Assert.IsInstanceOf <MXCIFQuadTreeNodeLeaf>(tree.Root);

            Set(9.9, 9.9, 0.01, 0.01, "R8", tree);

            Assert.IsFalse(tree.Root is MXCIFQuadTreeNodeLeaf);
            Assert.AreEqual(1, tree.Root.Level);
            Assert.AreEqual(4, NavigateLeaf(tree, "nw").Count);
            var collection = (IList <XYWHRectangleWValue>)NavigateLeaf(tree, "nw").Data;

            Assert.AreEqual(4, collection.Count);
            Compare(10, 10, 0.01, 0.01, "R7", collection[0]);
            Compare(9.9, 10, 0.01, 0.01, "R6", collection[1]);
            Compare(10, 9.9, 0.01, 0.01, "R5", collection[2]);
            Compare(9.9, 9.9, 0.01, 0.01, "R8", collection[3]);
            AssertCollect(tree, 9, 10, 1, 1, "R6,R7");
            AssertCollect(tree, 10, 9, 1, 1, "R5,R7");
            AssertCollect(tree, 10, 10, 1, 1, "R7");
            AssertCollect(tree, 9, 9, 2, 2, "R5,R6,R7,R8");
            AssertCollectAll(tree, "R5,R6,R7,R8");

            Set(9.9, 10, 0.01, 0.01, "R9", tree);
            Set(10, 9.9, 0.01, 0.01, "R10", tree);
            Set(10, 10, 0.01, 0.01, "R11", tree);
            Set(10, 10, 0.01, 0.01, "R12", tree);
            Set(10, 10, 0.01, 0.01, "R13", tree);

            Assert.AreEqual(4, NavigateLeaf(tree, "nw").Count);
            Assert.AreEqual(2, NavigateLeaf(tree, "nw").Level);
            Assert.AreEqual(4, collection.Count);
            Compare(10, 10, 0.01, 0.01, "R13", collection[0]);
            Compare(9.9, 10, 0.01, 0.01, "R9", collection[1]);
            Compare(10, 9.9, 0.01, 0.01, "R10", collection[2]);
            Compare(9.9, 9.9, 0.01, 0.01, "R8", collection[3]);
            AssertCollect(tree, 9, 10, 1, 1, "R9,R13");
            AssertCollect(tree, 10, 9, 1, 1, "R10,R13");
            AssertCollect(tree, 10, 10, 1, 1, "R13");
            AssertCollect(tree, 9, 9, 2, 2, "R8,R9,R10,R13");

            Delete(9.9, 10, 0.01, 0.01, tree);
            Delete(10, 9.9, 0.01, 0.01, tree);
            Delete(10, 9.9, 0.01, 0.01, tree);
            Delete(10, 9.9, 0.01, 0.01, tree);
            AssertCollect(tree, 9, 10, 1, 1, "R13");
            AssertCollect(tree, 10, 9, 1, 1, "R13");
            AssertCollect(tree, 10, 10, 1, 1, "R13");
            AssertCollect(tree, 9, 9, 2, 2, "R8,R13");
            AssertCollectAll(tree, "R8,R13");

            Assert.AreEqual(2, NavigateLeaf(tree, "").Count);
            collection = (IList <XYWHRectangleWValue>)NavigateLeaf(tree, "").Data;
            Assert.AreEqual(2, collection.Count);
            Compare(10, 10, 0.01, 0.01, "R13", collection[0]);
            Compare(9.9, 9.9, 0.01, 0.01, "R8", collection[1]);

            Delete(9.9, 9.9, 0.01, 0.01, tree);
            Delete(10, 10, 0.01, 0.01, tree);
            Assert.IsInstanceOf <MXCIFQuadTreeNodeLeaf>(tree.Root);
            Assert.AreEqual(0, NavigateLeaf(tree, "").Count);
            AssertCollectAll(tree, "");
        }