public void KdTree2D_NearestNeighbour_Smoke_Test()
        {
            var distanceCalculator = new DistanceCalculator2D();

            var testPts = new List <int[]> {
                new int[2] {
                    3, 6
                }, new int[2] {
                    17, 15
                },
                new int[2] {
                    13, 15
                }, new int[2] {
                    6, 12
                }, new int[2] {
                    9, 1
                },
                new int[2] {
                    2, 7
                }, new int[2] {
                    10, 19
                }
            };

            var tree = new KDTree <int>(2);

            foreach (var pt in testPts)
            {
                tree.Insert(pt);
            }

            //IEnumerable tests using linq.
            Assert.AreEqual(tree.Count, tree.Count());

            int j = testPts.Count - 1;

            while (testPts.Count > 0)
            {
                var testPoint       = new int[] { 10, 20 };
                var nearestNeigbour = tree.NearestNeighbour(new DistanceCalculator2D(), testPoint);
                var actualNeigbour  = GetActualNearestNeighbour(testPts, testPoint);
                Assert.IsTrue(distanceCalculator.Compare(actualNeigbour, nearestNeigbour, testPoint) == 0);

                tree.Delete(testPts[j]);
                testPts.RemoveAt(j);
                j--;
            }


            //IEnumerable tests using linq.
            Assert.AreEqual(tree.Count, tree.Count());
        }
        public void KdTree2D_NearestNeighbour_Accuracy_Test()
        {
            var distanceCalculator = new DistanceCalculator2D();

            int nodeCount = 1000;
            var rnd       = new Random();

            var testPts = new List <int[]>();

            for (int i = 0; i < nodeCount; i++)
            {
                var start = i + rnd.Next(0, int.MaxValue - 100);
                var end   = start + rnd.Next(1, 10);

                testPts.Add(new int[] { start, end });
            }

            var tree = new KDTree <int>(2);

            foreach (var pt in testPts)
            {
                tree.Insert(pt);
            }

            //IEnumerable tests using linq.
            Assert.AreEqual(tree.Count, tree.Count());

            int j = testPts.Count - 1;

            while (testPts.Count > 0)
            {
                var testPoint = new int[] { rnd.Next(), rnd.Next() };

                var nearestNeigbour = tree.NearestNeighbour(distanceCalculator, testPoint);
                var actualNeigbour  = GetActualNearestNeighbour(testPts, testPoint);

                Assert.IsTrue(distanceCalculator.Compare(actualNeigbour, nearestNeigbour, testPoint) == 0);

                tree.Delete(testPts[j]);
                testPts.RemoveAt(j);
                j--;
            }


            //IEnumerable tests using linq.
            Assert.AreEqual(tree.Count, tree.Count());
        }