protected virtual double CalculateActualInterval(Size availableSize)
{
if (Interval != null)
{
return Interval.Value;
}
// Adjust maximum interval count adjusted for current axis
double adjustedMaximumIntervalsPer200Pixels = (Orientation == AxisOrientation.X ? 0.8 : 1.0) * MaximumAxisIntervalsPer200Pixels;
// Calculate maximum interval count for current space
double maximumIntervalCount = Math.Max(GetLength(availableSize) * adjustedMaximumIntervalsPer200Pixels / 200.0, 1.0);
// Calculate range
double range = ActualDoubleRange.Maximum - ActualDoubleRange.Minimum;
// Calculate largest acceptable interval
double bestInterval = range / maximumIntervalCount;
// Calculate mimimum ideal interval (ideal => something that gives nice axis values)
double minimumIdealInterval = Math.Pow(10, Math.Floor(Math.Log10(bestInterval)));
// Walk the list of ideal multipliers
foreach (int idealMultiplier in new int[] { 10, 5, 2, 1 })
{
// Check the current ideal multiplier against the maximum count
double currentIdealInterval = minimumIdealInterval * idealMultiplier;
if (maximumIntervalCount < (range / currentIdealInterval))
{
// Went too far, break out
break;
}
// Update the best interval
bestInterval = currentIdealInterval;
}
// Return best interval
return bestInterval;
}