// use 10^n * 1, 2, or 5 as marker intervals public static Scale CreateScale(double minValue, double maxValue, int maxNoOfMarkers, bool adjustStartAndEndValues) { Scale scale = new Scale(); if (maxNoOfMarkers < 2) { maxNoOfMarkers = 2; } double intervalLength = Math.Abs(maxValue - minValue); if (intervalLength == 0) { intervalLength = double.Epsilon; } double minMarkerInterval = intervalLength / (maxNoOfMarkers - 1); double firstMarkerValue; double lastMarkerValue; double log10 = Math.Log10(minMarkerInterval); int n = (int)Math.Floor(log10); double scaledMinMarkerInterval = minMarkerInterval / Math.Pow(10, n); // 1 <= scaledMinMarkerInterval < 10 double markerInterval; if (scaledMinMarkerInterval <= 2) { markerInterval = 2 * Math.Pow(10, n); } else if (scaledMinMarkerInterval <= 5) { markerInterval = 5 * Math.Pow(10, n); } else { markerInterval = 10 * Math.Pow(10, n); } if (adjustStartAndEndValues) { firstMarkerValue = Math.Floor(minValue / markerInterval) * markerInterval; lastMarkerValue = Math.Ceiling(maxValue / markerInterval) * markerInterval; scale.Start = new Distance(firstMarkerValue); scale.End = new Distance(lastMarkerValue); } else { scale.Start = new Distance(minValue); scale.End = new Distance(maxValue); firstMarkerValue = Math.Floor(minValue / markerInterval) * markerInterval; if (firstMarkerValue < minValue) { firstMarkerValue += markerInterval; } lastMarkerValue = Math.Ceiling(maxValue / markerInterval) * markerInterval; if (lastMarkerValue > maxValue) { lastMarkerValue -= markerInterval; } } scale.Markers = new List <IUnit>(); for (double value = firstMarkerValue; value <= lastMarkerValue; value += markerInterval) { scale.Markers.Add(new Distance(value)); } return(scale); }
public static Scale CreateScale(double minValue, double maxValue, int maxNoOfMarkers, bool adjustStartAndEndValues) { double[] VALID_MARKER_INTERVALS = new double[] { 0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 15, 30, 1 * 60, 2 * 60, 5 * 60, 15 * 60, 30 * 60, 1 * 3600, 2 * 3600, 6 * 3600, 12 * 3600, 24 * 3600 }; Scale scale = new Scale(); if (maxNoOfMarkers < 2) { maxNoOfMarkers = 2; } double intervalLength = Math.Abs(maxValue - minValue); if (intervalLength == 0) { intervalLength = double.Epsilon; } double minMarkerInterval = intervalLength / (maxNoOfMarkers - 1); double firstMarkerValue; double lastMarkerValue; double markerInterval = VALID_MARKER_INTERVALS[VALID_MARKER_INTERVALS.Length - 1]; foreach (double mi in VALID_MARKER_INTERVALS) { if (minMarkerInterval < mi) { markerInterval = mi; break; } } if (adjustStartAndEndValues) { firstMarkerValue = Math.Floor(minValue / markerInterval) * markerInterval; lastMarkerValue = Math.Ceiling(maxValue / markerInterval) * markerInterval; scale.Start = new ElapsedTime(firstMarkerValue); scale.End = new ElapsedTime(lastMarkerValue); } else { scale.Start = new ElapsedTime(minValue); scale.End = new ElapsedTime(maxValue); firstMarkerValue = Math.Floor(minValue / markerInterval) * markerInterval; if (firstMarkerValue < minValue) { firstMarkerValue += markerInterval; } lastMarkerValue = Math.Ceiling(maxValue / markerInterval) * markerInterval; if (lastMarkerValue > maxValue) { lastMarkerValue -= markerInterval; } } scale.Markers = new List <IUnit>(); for (double value = firstMarkerValue; value <= lastMarkerValue; value += markerInterval) { scale.Markers.Add(new ElapsedTime(value)); } return(scale); }