public OneDimentionalInterval(T start, T end, Lazy <T> defaultValue) { Start = start; End = new List <T> { end }; NextDimensionIntervals = new OneDimentionalIntervalTree <T>(defaultValue); }
public OneDimentionalInterval(T start, T end, Lazy <T> defaultValue, IComparer <T> comparer = null) { this.comparer = comparer ?? Comparer <T> .Default; Start = start; End = new List <T> { end }; NextDimensionIntervals = new OneDimentionalIntervalTree <T>(defaultValue, this.comparer); }
public IntervalTree(int dimension) { if (dimension <= 0) { throw new Exception("Dimension should be greater than 0."); } this.dimensions = dimension; tree = new OneDimentionalIntervalTree <T>(defaultValue); }
/// <summary> /// Does this interval overlap with any interval in this interval tree? /// </summary> private List <Tuple <T[], T[]> > getOverlaps(OneDimentionalIntervalTree <T> currentTree, T[] start, T[] end, int dimension) { var nodes = currentTree.GetOverlaps(new OneDimentionalInterval <T>(start[dimension], end[dimension], defaultValue)); if (dimension + 1 == dimensions) { var result = new List <Tuple <T[], T[]> >(); foreach (var node in nodes) { var fStart = new T[dimensions]; var fEnd = new T[dimensions]; fStart[dimension] = node.Start; fEnd[dimension] = node.End[node.MatchingEndIndex]; var thisDimResult = new Tuple <T[], T[]>(fStart, fEnd); result.Add(thisDimResult); } return(result); } else { var result = new List <Tuple <T[], T[]> >(); foreach (var node in nodes) { var nextDimResult = getOverlaps(node.NextDimensionIntervals, start, end, dimension + 1); foreach (var nextResult in nextDimResult) { nextResult.Item1[dimension] = node.Start; nextResult.Item2[dimension] = node.End[node.MatchingEndIndex]; result.Add(nextResult); } } return(result); } }