Exemple #1
0
        public static NumericSequence Calculate(NumericRangeInfo range, double?interval = null, double?intervalOffset = null, int maxCount = 10, int minPower = -2147483648, DoubleR10[] steps = null, bool useZeroRefPoint = true, double maxAllowedMargin = 1.0)
        {
            NumericSequence numericSequence = new NumericSequence();

            if (steps == null)
            {
                steps = NumericSequence.DefaultGridSteps;
            }
            long num1 = 0L;

            numericSequence._maxAllowedMargin = (DoubleR10)maxAllowedMargin;
            if (range.ForsedSingleStop.HasValue)
            {
                DoubleR10 doubleR10 = range.ForsedSingleStop.Value;
                numericSequence._interval       = range.Maximum - range.Minimum;
                numericSequence._intervalOffset = doubleR10;
                numericSequence._min            = range.Minimum;
                numericSequence._max            = range.Maximum;
                numericSequence._sequence.Add(doubleR10);
                numericSequence.ExtendToCover(range.Minimum, range.Maximum);
                return(numericSequence);
            }
            numericSequence._interval       = interval.HasValue ? (DoubleR10)Math.Abs(interval.Value) : DoubleR10.Zero;
            numericSequence._intervalOffset = intervalOffset.HasValue ? (DoubleR10)intervalOffset.Value : DoubleR10.MinValue;
            numericSequence._min            = DoubleR10.Zero;
            numericSequence._max            = DoubleR10.Zero;
            maxCount = Math.Max(maxCount, 1);
            maxCount = Math.Min(maxCount, 1000);
            numericSequence._canExtendMin = maxAllowedMargin > 0.0 && range.HasDataRange && !range.HasMin && range.Minimum != 0;
            numericSequence._canExtendMax = maxAllowedMargin > 0.0 && range.HasDataRange && !range.HasMax && range.Maximum != 0;
            if (interval.HasValue && numericSequence._interval != 0 && intervalOffset.HasValue)
            {
                num1 = (long)(range.Size / numericSequence._interval);
                numericSequence._min = range.Minimum;
                numericSequence._max = range.Minimum + (DoubleR10)num1 * numericSequence._interval;
            }
            else
            {
                int num2 = !(numericSequence._interval != 0) ? (!(range.Size != 0) ? range.Maximum.Log10() : range.Size.Log10()) : numericSequence._interval.Log10() + 1;
                int num3 = steps[0].Log10();
                int num4 = num2 - num3 - 1 - ((DoubleR10)maxCount - (DoubleR10)1).Log10();
                if (minPower != int.MinValue)
                {
                    num4 = Math.Max(num4, minPower - num3);
                }
                if (numericSequence._interval != 0)
                {
                    NumericRangeInfo numericRangeInfo = new NumericRangeInfo(DoubleR10.Floor(range.Minimum, num4), DoubleR10.Ceiling(range.Maximum, num4));
                    numericRangeInfo.ShrinkByStep(range, numericSequence._interval, useZeroRefPoint);
                    numericSequence._min = numericRangeInfo.Minimum;
                    numericSequence._max = numericRangeInfo.Maximum;
                    num1 = DoubleR10.CountSteps(numericRangeInfo.Size, numericSequence._interval);
                }
                else
                {
                    for (int index1 = 0; index1 < 3; ++index1)
                    {
                        int       exp       = num4 + index1;
                        DoubleR10 doubleR10 = DoubleR10.Pow10(exp);
                        DoubleR10 minimum   = DoubleR10.Floor(range.Minimum, exp);
                        DoubleR10 maximum   = DoubleR10.Ceiling(range.Maximum, exp);
                        for (int index2 = 0; index2 < steps.Length; ++index2)
                        {
                            DoubleR10 step = steps[index2] * doubleR10;
                            step.Normalize();
                            NumericRangeInfo roundRange = new NumericRangeInfo(minimum, maximum);
                            if (steps == NumericSequence.DefaultGridSteps)
                            {
                                roundRange.ShrinkByStepQuick(range, step);
                            }
                            else
                            {
                                roundRange.ShrinkByStep(range, step, useZeroRefPoint);
                            }
                            if (numericSequence._canExtendMin && range.Minimum == roundRange.Minimum && maxAllowedMargin >= 1.0)
                            {
                                roundRange.Minimum -= step;
                            }
                            if (numericSequence._canExtendMax && range.Maximum == roundRange.Maximum && maxAllowedMargin >= 1.0)
                            {
                                roundRange.Maximum += step;
                            }
                            num1 = NumericSequence.GetCount(range, roundRange, step, numericSequence._canExtendMin, numericSequence._canExtendMin, maxAllowedMargin, (long)maxCount);
                            if (num1 <= (long)maxCount || index1 == 2 && index2 == steps.Length - 1)
                            {
                                numericSequence._interval = step;
                                numericSequence._min      = roundRange.Minimum;
                                numericSequence._max      = roundRange.Maximum;
                                break;
                            }
                        }
                        if (numericSequence._interval != 0)
                        {
                            break;
                        }
                    }
                }
            }
            if (num1 > (long)(maxCount * 32))
            {
                num1 = (long)(maxCount * 32);
                numericSequence._interval = numericSequence.Size / (DoubleR10)num1;
            }
            if (intervalOffset.HasValue)
            {
                numericSequence._intervalOffset = numericSequence._intervalOffset % numericSequence._interval;
                DoubleR10 doubleR10 = range.Minimum + numericSequence._intervalOffset - numericSequence._min;
                numericSequence._min = numericSequence._min + doubleR10;
                numericSequence._max = numericSequence._max + doubleR10;
            }
            else
            {
                numericSequence._intervalOffset = numericSequence._min - range.Minimum;
            }
            numericSequence.FixDoubleOverflow(range);
            numericSequence._sequence = (IList <DoubleR10>) new List <DoubleR10>();
            DoubleR10 doubleR10_1 = numericSequence._min;

            numericSequence._sequence.Add(doubleR10_1);
            for (int index = 0; (long)index < num1; ++index)
            {
                doubleR10_1 = doubleR10_1.Add(ref numericSequence._interval);
                if (!doubleR10_1.IsDoubleInfinity())
                {
                    numericSequence._sequence.Add(doubleR10_1);
                }
            }
            numericSequence.ExtendToCover(range.Minimum, range.Maximum);
            return(numericSequence);
        }