コード例 #1
0
        internal List<KNNPoint> PointsWithinRadiusOfWithDistance(VectorData targetPoint, double radius)
        {
            var result = new List<KNNPoint>();

            if (root == null)
            {
                return null;
            }

            FindPointsWithinRadiusWithDistance(root, targetPoint, result, radius);

            return result;
        }
コード例 #2
0
        internal List<VectorData> PointsWithinRadiusOf(VectorData targetPoint, double radius)
        {
            var result = new List<VectorData>();

            if (root == null)
            {
                return null;
            }

            FindPointsWithinRadius(root, targetPoint, result, radius);

            return result;
        }
コード例 #3
0
        void FindPointsWithinRadius(KDNode node, VectorData targetPoint, List<VectorData> result, double radius)
        {
            if (node.Values != targetPoint)
            {
                TryToSaveRadius(node, targetPoint, result, radius);
            }

            var dMinus1 = node.Dimension - 1;
            if (dMinus1 < 0)
            {
                dMinus1 = DimensionCount - 1;
            }

            var perpendicularDistance = Math.Abs(node.Values.Data.Skip(node.Dimension).First() - targetPoint.Data.Skip(dMinus1).First());
            if (perpendicularDistance < radius || node.Values == targetPoint)
            {
                if (node.Above != null)
                {
                    FindPointsWithinRadius(node.Above, targetPoint, result, radius);
                }
                if (node.Below != null)
                {
                    FindPointsWithinRadius(node.Below, targetPoint, result, radius);
                }
            }
            else
            {
                if (targetPoint.Data.Skip(dMinus1).First() < node.Values.Data.Skip(node.Dimension).First())
                {
                    if (node.Below != null)
                    {
                        FindPointsWithinRadius(node.Below, targetPoint, result, radius);
                    }
                }
                else
                {
                    if (node.Above != null)
                    {
                        FindPointsWithinRadius(node.Above, targetPoint, result, radius);
                    }
                }
            }
        }
コード例 #4
0
 void TryToSaveRadiusWithDistance(KDNode node, VectorData target, List<KNNPoint> result, double radius)
 {
     if (node == null)
     {
         return;
     }
     double distance = AbstractDistanceFunction.CalculateDistance(target, node.Values);
     if (radius < distance)
     {
         return;
     }
     result.Add(new KNNPoint(node.Values, distance));
 }
コード例 #5
0
        void TryToSaveRadius(KDNode node, VectorData target, List<VectorData> result, double radius)
        {
            if (node == null)
            {
                return;
            }

            var distance = AbstractDistanceFunction.CalculateDistance(target, node.Values);
            if (radius < distance)
            {
                return;
            }

            result.Add(node.Values);
        }