public void ClasdistanceToThrowTest() { var p1 = new PointIdFloat(0, new List <float>() { 1.0f }); var p2 = new PointIdFloat(1, new List <float>() { 2.0f, 3.0f }); VectorDistanceHelper.L2Norm(p1.coordinates, p2.coordinates); }
public void ClasdistanceIsSimmetricToTest() { var x = new PointIdFloat(0, new List <float>() { 1.0f }); var y = new PointIdFloat(1, new List <float>() { 2.0f }); Assert.AreEqual(VectorDistanceHelper.L2Norm(x.coordinates, y.coordinates), VectorDistanceHelper.L2Norm(y.coordinates, x.coordinates)); }
public void ClasdistanceToTest() { PointIdFloat x = new PointIdFloat(0, new List <float>() { 1.0f }); PointIdFloat y = new PointIdFloat(1, new List <float>() { 2.0f }); Assert.AreEqual(0.0f, VectorDistanceHelper.L2Norm(x.coordinates, x.coordinates)); Assert.AreEqual(1.0f, VectorDistanceHelper.L2Norm(x.coordinates, y.coordinates)); x = new PointIdFloat(2, new List <float>() { 1.0f, 2.2f }); y = new PointIdFloat(3, new List <float>() { 4.0f, 6.2f }); Assert.AreEqual(0.0f, VectorDistanceHelper.L2Norm(y.coordinates, y.coordinates)); Assert.IsTrue(Math.Abs(3.535534f - VectorDistanceHelper.L2Norm(x.coordinates, y.coordinates)) < 1e-5); x = new PointIdFloat(5, new List <float>() { 1.0f, 2.5f, 3.0f }); y = new PointIdFloat(6, new List <float>() { 2.0f, 3.0f, 3.0f }); var d1 = 0.6454972f; var d2 = VectorDistanceHelper.L2Norm(x.coordinates, y.coordinates); Assert.IsTrue(Math.Abs(d1 - d2) < 1e-5); }
public void ClasPointsWithinDistanceTest() { IPointIdFloat p1 = new PointIdFloat(0, 1f, 2f); IPointIdFloat p2 = new PointIdFloat(1, 2f, 1f); IPointIdFloat p3 = new PointIdFloat(2, 200f, -100f); IPointIdFloat p4 = new PointIdFloat(3, 150f, -50f); List <IPointIdFloat> points2D = new List <IPointIdFloat>() { new PointIdFloat(0, 1f, 2f), new PointIdFloat(4, 0f, 1f), new PointIdFloat(3, 3f, 3f), new PointIdFloat(5, 1.5f, 2f), new PointIdFloat(6, 5f, -1f) }; List <IPointIdFloat> points3D = new List <IPointIdFloat>() { new PointIdFloat(0, 0f, 0f, 0f), new PointIdFloat(1, -1f, 2f, 3.5f), new PointIdFloat(3, 0.55f, 30f, -10f), new PointIdFloat(2, 1f, 1.2f, 1.5f), new PointIdFloat(4, 4.25f, 0.37f, 0f) }; Func <IPointIdFloat, float> keySelector = t => KdTree.KdTreeNode.KeyByDepth(t, 0); //should return an empty Set if all the points are not within distance var kdt = new KdTree(null, p1); Func <IPointIdFloat, float, List <IPointIdFloat>, bool> AssertResult = (target, maxDistance, expectedResults) => { var results = kdt.PointsWithinDistance(target, maxDistance); if (!SequenceEquivalent(expectedResults, results, keySelector)) { var distance = results.Select(c => VectorDistanceHelper.L2(c.coordinates, target.coordinates)).ToArray(); results = kdt.PointsWithinDistance(target, maxDistance); Assert.IsTrue(SequenceEquivalent(expectedResults, results, keySelector)); } results.ToList().ForEach(p => { //Console.WriteLine(string.Format("{0}, {1}", p.ToString(), // VectorDistanceHelper.L2(p.coordinates, target.coordinates))); Assert.IsTrue(VectorDistanceHelper.L2(p.coordinates, target.coordinates) <= maxDistance); }); return(true); }; var result = kdt.PointsWithinDistance(p3, 100); Assert.AreEqual(0, result.Count()); kdt = new KdTree(null, p1, p2); result = kdt.PointsWithinDistance(p3, 100); Assert.AreEqual(0, result.Count()); kdt = new KdTree(null, p1); AssertResult(p2, 10, new List <IPointIdFloat>() { p1 }); AssertResult(p1, 1, new List <IPointIdFloat>() { p1 }); //should include the points itself, if in the tree kdt = new KdTree(null, p1, p2); AssertResult(p2, 2, new List <IPointIdFloat>() { p1, p2 }); AssertResult(p2, 0, new List <IPointIdFloat>() { p2 }); IPointIdFloat p3D = points3D.First(); kdt = new KdTree(null, p3D); AssertResult(p3D, 2, new List <IPointIdFloat>() { p3D }); //should return all the points within distance kdt = new KdTree(points3D); AssertResult(new PointIdFloat(0, 0.5f, 0.6f, 0.7f), 2f, new List <IPointIdFloat>() { points3D[0], points3D[3] }); AssertResult(new PointIdFloat(1, -5f, -5f, -5f), 1f, new List <IPointIdFloat>() { }); AssertResult(new PointIdFloat(2, -5f, -5.5f, -6f), 12.5f, new List <IPointIdFloat>() { points3D[0], points3D[3], points3D[4] }); AssertResult(new PointIdFloat(3, -0.95f, 2.05f, 3.45f), 0.1f, new List <IPointIdFloat>() { points3D[1] }); AssertResult(new PointIdFloat(4, -0.9f, 2.05f, 3.45f), 4f, new List <IPointIdFloat>() { points3D[1], points3D[3] }); kdt = new KdTree(points2D); AssertResult(new PointIdFloat(5, 1.1f, 1.9f), 1, new List <IPointIdFloat>() { points2D[0], points2D[3] }); AssertResult(new PointIdFloat(6, 1.1f, 1.9f), 10, points2D); AssertResult(new PointIdFloat(7, -5f, 5f), 1, new List <IPointIdFloat>() { }); AssertResult(new PointIdFloat(8, -5f, 5f), 8, new List <IPointIdFloat>() { points2D[0], points2D[1], points2D[3] }); AssertResult(new PointIdFloat(9, -5f, 5f), 10, new List <IPointIdFloat>() { points2D[0], points2D[1], points2D[2], points2D[3] }); AssertResult(new PointIdFloat(10, 3.01f, 2.9999f), 0.1f, new List <IPointIdFloat>() { points2D[2] }); AssertResult(new PointIdFloat(11, 3.01f, 2.9999f), 2, new List <IPointIdFloat>() { points2D[2], points2D[3] }); AssertResult(new PointIdFloat(12, 1.6f, 2f), 10, points2D); AssertResult(new PointIdFloat(13, 160f, 2f), 160, new List <IPointIdFloat>() { points2D[0], points2D[2], points2D[3], points2D[4] }); }