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); }
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); }
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); }