Esempio n. 1
0
        int _IndexOfCumulatedDistance(double cumulatedDistance)
        {
            if (InternalCount == 0)
            {
                return((int)Math.Floor(cumulatedDistance / DefaultDistance));
            }

            int    delta = 0;
            double internalTotalDistance = InternalTotalDistance - this.paddingDistance;

            if (cumulatedDistance >= internalTotalDistance)
            {
                delta             = (int)Math.Floor((cumulatedDistance - internalTotalDistance) / DefaultDistance);
                cumulatedDistance = internalTotalDistance;
                return(InternalCount + delta);
            }

            var searchPosition = new DistanceLineCounter(cumulatedDistance, 0);
            DistanceLineCounterEntry  rbEntry         = rbTree.GetEntryAtCounterPosition(searchPosition, DistanceLineCounterKind.Distance, false);
            DistanceLineCounterSource rbValue         = rbEntry.Value;
            DistanceLineCounter       rbEntryPosition = rbEntry.GetCounterPosition();

            if (rbValue.SingleLineDistance > 0)
            {
                delta = (int)Math.Floor((cumulatedDistance - rbEntryPosition.Distance) / rbValue.SingleLineDistance);
            }
            return(rbEntryPosition.LineCount + delta);
        }
Esempio n. 2
0
        double _GetCumulatedDistanceAt(int index)
        {
            CheckRange("index", 0, Count + 1, index);

            if (index == Count + 1)
            {
                return(TotalDistance);
            }
            if (index == 0)
            {
                return(0);
            }

            int count = InternalCount;

            if (count == 0)
            {
                return(index * DefaultDistance);
            }

            if (index >= count)
            {
                int delta = index - count;
                DistanceLineCounter counter = rbTree.GetCounterTotal();
                return(counter.Distance + delta * DefaultDistance);
            }
            else
            {
                LineIndexEntryAt e = InitDistanceLine(index, false);
                e.rbEntryPosition = e.rbEntry.GetCounterPosition();
                return(e.rbEntryPosition.Distance + (index - e.rbEntryPosition.LineCount) * e.rbValue.SingleLineDistance);
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Constructs the class and initializes the internal tree.
        /// </summary>
        public DistanceRangeCounterCollection(double paddingDistance)
        {
            Count = 0;
            var startPos = new DistanceLineCounter(0, 0);

            rbTree = new DistanceLineCounterTree(startPos, false);
            this.paddingDistance = paddingDistance;
        }
Esempio n. 4
0
        /// <summary>
        /// Combines the counter values of this counter object with the values of another counter object
        /// and returns a new counter object.
        /// </summary>
        /// <param name="other">The other.</param>
        /// <param name="cookie">The cookie.</param>
        /// <returns></returns>
        public DistanceLineCounter Combine(DistanceLineCounter other, int cookie)
        {
            if (other == null || other.IsEmpty(int.MaxValue))
            {
                return(this);
            }

            if (this.IsEmpty(int.MaxValue))
            {
                return(other);
            }

            decimal addedvalue = Convert.ToDecimal(Distance + other.Distance);

            return(new DistanceLineCounter(decimal.ToDouble(addedvalue), LineCount + other.LineCount));
        }
Esempio n. 5
0
        /// <summary>
        /// Compares this counter with another counter. A cookie can specify
        /// a specific counter type.
        /// </summary>
        /// <param name="other">The other.</param>
        /// <param name="cookie">The cookie.</param>
        /// <returns></returns>
        public double Compare(DistanceLineCounter other, int cookie)
        {
            if (other == null)
            {
                return(0);
            }

            int cmp = 0;

            if ((cookie & DistanceLineCounterKind.Distance) != 0)
            {
                cmp = Distance.CompareTo(other.Distance);
            }

            if (cmp == 0 && (cookie & DistanceLineCounterKind.Lines) != 0)
            {
                cmp = LineCount.CompareTo(other.LineCount);
            }

            return(cmp);
        }
Esempio n. 6
0
 public DistanceLineCounterEntry GetEntryAtCounterPosition(DistanceLineCounter searchPosition, int cookie, bool preferLeftMost)
 {
     return((DistanceLineCounterEntry)base.GetEntryAtCounterPosition(searchPosition, cookie, preferLeftMost));
 }
Esempio n. 7
0
 public DistanceLineCounterEntry GetEntryAtCounterPosition(DistanceLineCounter searchPosition, int cookie)
 {
     return((DistanceLineCounterEntry)base.GetEntryAtCounterPosition(searchPosition, cookie));
 }
Esempio n. 8
0
 public DistanceLineCounterTree(DistanceLineCounter startPos, bool sorted)
     : base(startPos, sorted)
 {
 }