protected override void ComputeAxisValues(float min, float max) { float yMin = min; float yMax = max; int labelCount = Axis.LabelCount; double range = Math.Abs(yMax - yMin); if (labelCount == 0 || range <= 0 || double.IsInfinity(range)) { Axis.entries = Array.Empty <float>(); Axis.centeredEntries = Array.Empty <float>(); Axis.entryCount = 0; return; } // Find out how much spacing (in y value space) between axis values double rawInterval = range / labelCount; double interval = rawInterval.RoundToNextSignificant(); // If granularity is enabled, then do not allow the interval to go below specified granularity. // This is used to avoid repeated values when rounding values for display. if (Axis.GranularityEnabled) { interval = interval < Axis.Granularity ? Axis.Granularity : interval; } // Normalize interval double intervalMagnitude = (Math.Pow(10, (int)Math.Log10(interval))).RoundToNextSignificant(); int intervalSigDigit = (int)(interval / intervalMagnitude); if (intervalSigDigit > 5) { // Use one order of magnitude higher, to avoid intervals like 0.9 or 90 // if it's 0.0 after floor(), we use the old value interval = Math.Floor(10.0 * intervalMagnitude) == 0.0 ? interval : Math.Floor(10.0 * intervalMagnitude); } var centeringEnabled = Axis.IsCenterAxisLabelsEnabled; int n = centeringEnabled ? 1 : 0; // force label count if (Axis.IsForceLabelsEnabled) { float step = (float)range / (float)(labelCount - 1); Axis.entryCount = labelCount; if (Axis.entries.Count < labelCount) { // Ensure stops contains at least numStops elements. Axis.entries = new float[labelCount]; } float v = min; for (int i = 0; i < labelCount; i++) { Axis.entries[i] = v; v += step; } n = labelCount; // no forced count } else { double first = interval == 0.0 ? 0.0 : Math.Ceiling(yMin / interval) * interval; if (centeringEnabled) { first -= interval; } double last = interval == 0.0 ? 0.0 : NumberExtensions.NextDouble(Math.Floor(yMax / interval) * interval); double f; int i; if (interval != 0.0) { for (f = first; f <= last; f += interval) { ++n; } } n++; Axis.entryCount = n; if (Axis.entries.Count < n) { // Ensure stops contains at least numStops elements. Axis.entries = new float[n]; } for (f = first, i = 0; i < n; f += interval, ++i) { if (f == 0.0) // Fix for negative zero case (Where value == -0.0, and 0.0 == -0.0) { f = 0.0; } Axis.entries[i] = (float)f; } } // set decimals if (interval < 1) { Axis.decimals = (int)Math.Ceiling(-Math.Log10(interval)); } else { Axis.decimals = 0; } if (centeringEnabled) { if (Axis.centeredEntries.Length < n) { Axis.centeredEntries = new float[n]; } float offset = (Axis.entries[1] - Axis.entries[0]) / 2f; for (int i = 0; i < n; i++) { Axis.centeredEntries[i] = Axis.entries[i] + offset; } } Axis.axisMinimum = Axis.entries[0]; Axis.axisMaximum = Axis.entries[n - 1]; Axis.axisRange = Math.Abs(Axis.axisMaximum - Axis.axisMinimum); }