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