Ejemplo n.º 1
0
        private static List <IIntervalable> FindOverlapRange(IntervalNode node, IIntervalable interval)
        {
            if (node != null)
            {
                return(node.GetOverlap(interval));
            }

            return(new List <IIntervalable>());
        }
Ejemplo n.º 2
0
 /// <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);
         }
     }
 }
Ejemplo n.º 3
0
        /// <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);
        }
Ejemplo n.º 4
0
        /// <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);
        }
Ejemplo n.º 5
0
 public List <IIntervalable> FindOverlaps(IIntervalable interval) =>
 _root.GetOverlap(interval);