コード例 #1
0
 public OneDimentionalInterval(T start, T end, Lazy <T> defaultValue)
 {
     Start = start;
     End   = new List <T> {
         end
     };
     NextDimensionIntervals = new OneDimentionalIntervalTree <T>(defaultValue);
 }
コード例 #2
0
 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);
 }
コード例 #3
0
        public IntervalTree(int dimension)
        {
            if (dimension <= 0)
            {
                throw new Exception("Dimension should be greater than 0.");
            }

            this.dimensions = dimension;
            tree            = new OneDimentionalIntervalTree <T>(defaultValue);
        }
コード例 #4
0
        /// <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);
            }
        }