예제 #1
0
        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);
        }
예제 #2
0
        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));
        }
예제 #3
0
        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);
        }
예제 #4
0
        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]
            });
        }