private static List <IIntervalable> FindOverlapRange(IntervalNode node, IIntervalable interval) { if (node != null) { return(node.GetOverlap(interval)); } return(new List <IIntervalable>()); }
/// <summary> /// 将备选区间添加到指定列表中 /// </summary> /// <param name="interval">备选区间不能与指定区间相等</param> /// <param name="list"></param> /// <param name="candidates"></param> private void AddOverlaps(IIntervalable interval, List <IIntervalable> list, List <IIntervalable> candidates) { for (int i = 0; i < candidates.Count; i++) { var inter = candidates[i]; if (!inter.Equals(interval)) { list.Add(inter); } } }
/// <summary> /// 在当前节点的区间集合中寻找与指定区间重叠的 /// </summary> /// <param name="interval">一个区间,与该区间重叠</param> /// <param name="direction">方向,表示是左边还是右边</param> /// <returns></returns> private List <IIntervalable> Check4Overlap(IIntervalable interval, Direction direction) { var overlaps = new List <IIntervalable>(); foreach (var inter in _intervals) { if (direction == Direction.LEFT) // 检测与指定区间是否右边重叠: interval ________________ |_point| { // ______________________ inter (_point 处于 inter区间里面) if (inter.Start <= interval.End) { overlaps.Add(inter); } } else // 检测与指定区间是否左边重叠: |_point| ________________ interval { // ___________________________ inter (_point 处于 inter区间里面) if (inter.End >= interval.Start) { overlaps.Add(inter); } } } return(overlaps); }
/// <summary> /// 寻找与指定区间有重叠的区间 /// </summary> /// <param name="interval"></param> /// <returns></returns> public List <IIntervalable> GetOverlap(IIntervalable interval) { var overlaps = new List <IIntervalable>(); if (_point < interval.Start) { // 右边找找 AddOverlaps(interval, overlaps, FindOverlapRange(_right, interval)); AddOverlaps(interval, overlaps, Check4Overlap(interval, Direction.RIGHT)); } else if (_point > interval.End) // 目标区间在当前节点的中点的左边 { AddOverlaps(interval, overlaps, FindOverlapRange(_left, interval)); AddOverlaps(interval, overlaps, Check4Overlap(interval, Direction.LEFT)); } else { AddOverlaps(interval, overlaps, _intervals); AddOverlaps(interval, overlaps, FindOverlapRange(_left, interval)); AddOverlaps(interval, overlaps, FindOverlapRange(_right, interval)); } return(overlaps); }
public List <IIntervalable> FindOverlaps(IIntervalable interval) => _root.GetOverlap(interval);