Exemple #1
0
        public void TestKDTreeSearchObject()
        {
            TreeReferencableObject[,] testVectors = new TreeReferencableObject[50, 3];
            Random rand = new Random(3567);

            for (int n = 0; n < 50; n++)
            {
                testVectors[n, 0] = new TreeReferencableObject(rand.NextDouble());
                testVectors[n, 1] = new TreeReferencableObject(rand.NextDouble());
                testVectors[n, 2] = new TreeReferencableObject(rand.NextDouble());
            }
            KDTree tree = new KDTree(testVectors);

            TreeReferencableObject[] zero = new TreeReferencableObject[3];
            zero[0] = new TreeReferencableObject(0.0);
            zero[1] = new TreeReferencableObject(0.0);
            zero[2] = new TreeReferencableObject(0.0);
            List <KDTreePoint> distances = new List <KDTreePoint>();

            tree.Search(zero, 5, ref distances);
            Assert.AreEqual(5, distances.Count);
            zero[0] = new TreeReferencableObject(0.6);
            zero[1] = new TreeReferencableObject(0.6);
            zero[2] = new TreeReferencableObject(0.6);
            tree.Search(zero, 5, ref distances);
            Assert.AreEqual(5, distances.Count);
            zero[0] = testVectors[0, 0];
            zero[1] = testVectors[0, 1];
            zero[2] = testVectors[0, 2];
            tree.Search(zero, 5, ref distances);
            // check that the target, which is also part of the dataset is the first
            Assert.AreEqual(0, ((KDTreePoint)distances[0]).index);
            Assert.AreEqual(0.0, ((KDTreePoint)distances[0]).distSquared);
        }
Exemple #2
0
        public void TestKDTreeUniqueSearchObject()
        {
            TreeReferencableObject[,] testVectors = new TreeReferencableObject[50, 3];
            Random rand = new Random(3567);

            for (int n = 0; n < 25; n++)
            {
                testVectors[n, 0] = new TreeReferencableObject(rand.NextDouble());
                testVectors[n, 1] = new TreeReferencableObject(rand.NextDouble());
                testVectors[n, 2] = new TreeReferencableObject(rand.NextDouble());
            }
            //second part of array is duplicate of first
            for (int n = 25; n < 50; n++)
            {
                testVectors[n, 0] = testVectors[n - 25, 0];
                testVectors[n, 1] = testVectors[n - 25, 1];
                testVectors[n, 2] = testVectors[n - 25, 2];
            }
            KDTree tree = new KDTree(testVectors);

            double[] zero = new double[3];
            zero[0] = 0.0;
            zero[1] = 0.0;
            zero[2] = 0.0;
            List <KDTreePoint> distances = new List <KDTreePoint>();

            tree.UniqueSearch(zero, 5, ref distances);
            Assert.AreEqual(5, distances.Count);
            zero[0] = testVectors[0, 0].GetValue();
            zero[1] = testVectors[0, 0].GetValue();
            zero[2] = testVectors[0, 0].GetValue();
            tree.UniqueSearch(zero, 5, ref distances);
            Assert.AreEqual(5, distances.Count);
            Assert.IsFalse((int)((KDTreePoint)distances[0]).index == 0);
            Assert.IsFalse(((KDTreePoint)distances[0]).distSquared == 0.0);
            Assert.IsFalse(((KDTreePoint)distances[0]).index == ((KDTreePoint)distances[1]).index);
            Assert.IsFalse(((KDTreePoint)distances[1]).index == ((KDTreePoint)distances[2]).index);
            Assert.IsFalse(((KDTreePoint)distances[2]).index == ((KDTreePoint)distances[3]).index);
            Assert.IsFalse(((KDTreePoint)distances[3]).index == ((KDTreePoint)distances[4]).index);
            zero[0] = 0.6;
            zero[1] = 0.6;
            zero[2] = 0.6;
            tree.UniqueSearch(zero, 5, ref distances);
            Assert.AreEqual(5, distances.Count);
        }
Exemple #3
0
        public void TestKDTreeSearchByDistanceObject()
        {
            TreeReferencableObject[,] testVectors = new TreeReferencableObject[50, 3];
            Random rand     = new Random(3567);
            bool   finished = false;
            int    n        = 0;

            while (!finished)
            {
                double x = rand.NextDouble();
                double y = rand.NextDouble();
                double z = rand.NextDouble();
                //create vector, reject if not within 0.25 of 0,0,0
                if (x * x + y * y + z * z < 0.25)
                {
                    testVectors[n, 0] = new TreeReferencableObject(x);
                    testVectors[n, 1] = new TreeReferencableObject(y);
                    testVectors[n, 2] = new TreeReferencableObject(z);
                    n++;
                    if (n == 25)
                    {
                        finished = true;
                    }
                }
            }
            finished = false;
            while (!finished)
            {
                double x = rand.NextDouble();
                double y = rand.NextDouble();
                double z = rand.NextDouble();
                //create vector, reject if not within 0.25 of 0,0,0
                if (x * x + y * y + z * z > 0.25)
                {
                    testVectors[n, 0] = new TreeReferencableObject(x);
                    testVectors[n, 1] = new TreeReferencableObject(y);
                    testVectors[n, 2] = new TreeReferencableObject(z);
                    n++;
                    if (n == 50)
                    {
                        finished = true;
                    }
                }
            }
            //now search by distance should return the first 25 values.
            KDTree tree = new KDTree(testVectors);

            double[] zero = new double[3];
            zero[0] = 0.0;
            zero[1] = 0.0;
            zero[2] = 0.0;
            int count;
            List <KDTreePoint> distances = new List <KDTreePoint>();

            tree.SearchByDistance(zero, 0.5, out count, ref distances, 30);
            Assert.AreEqual(25, count);
            Assert.IsTrue(((KDTreePoint)distances[count - 1]).distSquared < 0.25);
            zero[0] = testVectors[0, 0].GetValue();
            zero[1] = testVectors[0, 1].GetValue();
            zero[2] = testVectors[0, 2].GetValue();
            tree.SearchByDistance(zero, 0.5, out count, ref distances, 30);
            // check that the target, which is also part of the dataset is the first
            Assert.AreEqual(0, ((KDTreePoint)distances[0]).index);
            Assert.AreEqual(0.0, ((KDTreePoint)distances[0]).distSquared);
        }