Exemple #1
0
        // 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);
        }
Exemple #2
0
        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);
        }