/// <summary>
/// Perform a search within the given radius
/// </summary>
/// <param name="position">The center of the search area</param>
/// <param name="radius">The radius of the search</param>
/// <param name="maxResults">The maximum number of results to return</param>
/// <returns>The neighbors found</returns>
public Neighbor[] RadiusSearch(MCvPoint3D32f position, double radius, int maxResults)
{
_query.Data[0, 0] = position.X;
_query.Data[0, 1] = position.Y;
_query.Data[0, 2] = position.Z;
using (Mat indicies = new Mat(new Size(maxResults, 1), DepthType.Cv32S, 1))
using (Mat sqrDistances = new Mat(new Size(maxResults, 1), DepthType.Cv32F, 1))
{
indicies.SetTo(new MCvScalar(-1));
sqrDistances.SetTo(new MCvScalar(-1));
_flannIndex.RadiusSearch(_query, indicies, sqrDistances, radius, maxResults);
int[] indiciesVal = new int[indicies.Rows * indicies.Cols];
indicies.CopyTo(indiciesVal);
float[] sqrDistancesVal = new float[sqrDistances.Rows * sqrDistances.Cols];
sqrDistances.CopyTo(sqrDistancesVal);
List <Neighbor> neighbors = new List <Neighbor>();
for (int j = 0; j < maxResults; j++)
{
if (indiciesVal[j] <= 0)
{
break;
}
Neighbor n = new Neighbor();
n.Index = indiciesVal[j];
n.SquareDist = sqrDistancesVal[j];
neighbors.Add(n);
}
return(neighbors.ToArray());
}
}