68 lines
1.5 KiB
C#
68 lines
1.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Diagnostics;
|
|
|
|
namespace Microsoft.Research.DynamicDataDisplay.Charts
|
|
{
|
|
internal static class RoundingHelper
|
|
{
|
|
internal static int GetDifferenceLog(double min, double max)
|
|
{
|
|
return (int)Math.Round(Math.Log10(Math.Abs(max - min)));
|
|
}
|
|
|
|
internal static double Round(double number, int rem)
|
|
{
|
|
if (rem <= 0)
|
|
{
|
|
rem = MathHelper.Clamp(-rem, 0, 15);
|
|
return Math.Round(number, rem);
|
|
}
|
|
else
|
|
{
|
|
double pow = Math.Pow(10, rem - 1);
|
|
double val = pow * Math.Round(number / Math.Pow(10, rem - 1));
|
|
return val;
|
|
}
|
|
}
|
|
|
|
internal static double Round(double value, Range<double> range)
|
|
{
|
|
int log = GetDifferenceLog(range.Min, range.Max);
|
|
|
|
return Round(value, log);
|
|
}
|
|
|
|
internal static RoundingInfo CreateRoundedRange(double min, double max)
|
|
{
|
|
double delta = max - min;
|
|
|
|
if (delta == 0)
|
|
return new RoundingInfo { Min = min, Max = max, Log = 0 };
|
|
|
|
int log = (int)Math.Round(Math.Log10(Math.Abs(delta))) + 1;
|
|
|
|
double newMin = Round(min, log);
|
|
double newMax = Round(max, log);
|
|
if (newMin == newMax)
|
|
{
|
|
log--;
|
|
newMin = Round(min, log);
|
|
newMax = Round(max, log);
|
|
}
|
|
|
|
return new RoundingInfo { Min = newMin, Max = newMax, Log = log };
|
|
}
|
|
}
|
|
|
|
[DebuggerDisplay("{Min} - {Max}, Log = {Log}")]
|
|
internal sealed class RoundingInfo
|
|
{
|
|
public double Min { get; set; }
|
|
public double Max { get; set; }
|
|
public int Log { get; set; }
|
|
}
|
|
}
|