/// <summary> /// Return a square envelope containing the argument envelope, /// whose extent is a power of two and which is based at a power of 2. /// </summary> /// <param name="itemInterval"></param> public void ComputeKey(Interval itemInterval) { _level = ComputeLevel(itemInterval); _interval = new Interval(); //_interval = Interval.Create(); ComputeInterval(_level, itemInterval); // MD - would be nice to have a non-iterative form of this algorithm while (!_interval.Contains(itemInterval)) { _level += 1; ComputeInterval(_level, itemInterval); } }
/// <summary> /// /// </summary> /// <param name="interval"></param> /// <returns></returns> public static int ComputeLevel(Interval interval) { double dx = interval.Width; int level = DoubleBits.GetExponent(dx) + 1; return level; }
/// <summary> /// /// </summary> /// <param name="interval"></param> public Key(Interval interval) { ComputeKey(interval); }
/// <summary> /// /// </summary> /// <param name="level"></param> /// <param name="itemInterval"></param> private void ComputeInterval(int level, Interval itemInterval) { var size = DoubleBits.PowerOf2(level); _pt = Math.Floor(itemInterval.Min / size) * size; _interval.Init(_pt, _pt + size); //_interval = Interval.Create(_pt, _pt + size); }
/// <summary> /// Creates a new interval instance, setting <see cref="Min"/>=<paramref name="interval.Min"/> and <see cref="Max"/>=<paramref name="interval.Max"/>. /// </summary> /// <param name="interval"></param> public Interval(Interval interval) { Init(interval.Min, interval.Max); }
/// <summary> /// Function to test if this <see cref="Interval"/> contains <paramref name="interval"/>. /// </summary> /// <remarks>This is more rigid than <see cref="Overlaps(Interval)"/></remarks> /// <param name="interval">The interval to test</param> /// <returns><c>true</c> if this interval contains <paramref name="interval"/></returns> public bool Contains(Interval interval) { return Contains(interval.Min, interval.Max); }
/// <summary> /// Function to test if this <see cref="Interval"/> overlaps <paramref name="interval"/>. /// </summary> /// <param name="interval">The interval to test</param> /// <returns><c>true</c> if this interval overlaps <paramref name="interval"/></returns> public bool Overlaps(Interval interval) { return Overlaps(interval.Min, interval.Max); }
/// <summary> /// Method to expand this interval to contain <paramref name="interval"/>. /// </summary> /// <param name="interval">The interval to contain.</param> public void ExpandToInclude(Interval interval) { if (interval.Max > Max) Max = interval.Max; if (interval.Min < Min) Min = interval.Min; }
/// <summary> /// /// </summary> /// <param name="interval"></param> /// <returns></returns> protected abstract bool IsSearchMatch(Interval interval);