/// <summary> /// recursively visit node and return points within given range /// </summary> /// <param name="currentTree"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="dimension"></param> /// <returns></returns> private List <T[]> getInRange( RangeTree <T> currentTree, T[] start, T[] end, int dimension) { var nodes = currentTree.GetInRange(start[dimension], end[dimension]); if (dimension + 1 == dimensions) { var result = new List <T[]>(); foreach (var value in nodes.SelectMany(x => x.Values)) { var thisDimResult = new T[dimensions]; thisDimResult[dimension] = value; result.Add(thisDimResult); } return(result); } else { var result = new List <T[]>(); foreach (var node in nodes) { var nextDimResult = getInRange(node.tree, start, end, dimension + 1); foreach (var value in node.Values) { foreach (var nextResult in nextDimResult) { nextResult[dimension] = value; result.Add(nextResult); } } } return(result); } }
/// <summary> /// recursively visit node and return points within given range /// </summary> /// <param name="currentTree"></param> /// <param name="start"></param> /// <param name="end"></param> /// <param name="dimension"></param> /// <returns></returns> private List <T[]> GetInRange( RangeTree <T> currentTree, T[] start, T[] end, int dimension) { var nodes = currentTree.GetInRange(start[dimension], end[dimension]); if (dimension + 1 == dimensions) { var result = new List <T[]>(); foreach (var node in nodes) { var thisDimResult = new T[dimensions]; thisDimResult[dimension] = node.Data; result.Add(thisDimResult); } return(result); } else { var result = new List <T[]>(); foreach (var node in nodes) { var nextDimResult = GetInRange(node.tree, start, end, dimension + 1); foreach (var nextResult in nextDimResult) { nextResult[dimension] = node.Data; result.Add(nextResult); } } return(result); } }