private bool approximate(ColorTreeNode <T> current, double[] position, ColorTreeNodeCollection <T> list, int maxLeaves, ref int visited) { // Compute distance from this node to the point double d = this.Distance(position, current.Position); list.Add(current, d); if (++visited > maxLeaves) { return(true); } // Check for leafs on the opposite sides of // the subtrees to nearest possible neighbors. // Prepare for recursion. The following null checks // will be used to avoid function calls if possible double value = position[current.Axis]; double median = current.Position[current.Axis]; double u = value - median; if (u <= 0) { if (current.Left != null) { if (approximate(current.Left, position, list, maxLeaves, ref visited)) { return(true); } } if (current.Right != null && Math.Abs(u) <= list.Maximum) { if (approximate(current.Right, position, list, maxLeaves, ref visited)) { return(true); } } } else { if (current.Right != null) { approximate(current.Right, position, list, maxLeaves, ref visited); } if (current.Left != null && Math.Abs(u) <= list.Maximum) { if (approximate(current.Left, position, list, maxLeaves, ref visited)) { return(true); } } } return(false); }
/// <summary> /// Retrieves the nearest points to a given point within a given radius. /// </summary> /// /// <param name="position">The queried point.</param> /// <param name="radius">The search radius.</param> /// <param name="maximum">The maximum number of neighbors to retrieve.</param> /// /// <returns>A list of neighbor points, ordered by distance.</returns> /// public ICollection <NodeDistance <ColorTreeNode <T> > > Nearest(double[] position, double radius, int maximum) { if (maximum == 0) { var list = new List <NodeDistance <ColorTreeNode <T> > >(); if (Root != null) { nearest(Root, position, radius, list); } return(list); } else { var list = new ColorTreeNodeCollection <T>(maximum); if (Root != null) { nearest(Root, position, radius, list); } return(list); } }
/// <summary> /// Retrieves a fixed number of nearest points to a given point. /// </summary> /// /// <param name="position">The queried point.</param> /// <param name="neighbors">The number of neighbors to retrieve.</param> /// /// <returns>A list of neighbor points, ordered by distance.</returns> /// public ColorTreeNodeCollection <T> Nearest(double[] position, int neighbors) { var list = new ColorTreeNodeCollection <T>(size: neighbors); if (Root != null) { nearest(Root, position, list); } return(list); }
/// <summary> /// k-nearest neighbors search. /// </summary> /// private void nearest(ColorTreeNode <T> current, double[] position, ColorTreeNodeCollection <T> list) { // Compute distance from this node to the point double d = this.Distance(position, current.Position); list.Add(current, d); // Check for leafs on the opposite sides of // the subtrees to nearest possible neighbors. // Prepare for recursion. The following null checks // will be used to avoid function calls if possible double value = position[current.Axis]; double median = current.Position[current.Axis]; double u = value - median; if (u <= 0) { if (current.Left != null) { nearest(current.Left, position, list); } if (current.Right != null && Math.Abs(u) <= list.Maximum) { nearest(current.Right, position, list); } } else { if (current.Right != null) { nearest(current.Right, position, list); } if (current.Left != null && Math.Abs(u) <= list.Maximum) { nearest(current.Left, position, list); } } }