我有一張繪製數據的圖表,但製圖組件爲刻度和刻度間隔選取了模糊的數字。我試圖定義一個簡單的算法來做到這一點。圖表將在中間水平顯示爲0,兩個顯示一個向左延伸,另一個向右延伸。例如可以說值繪製的-60和75我會顯示類似下面(道歉粗陋)Auto Scaling和Tick Interval Charting
-80 -60 -40 -20 0 20 40 60 80
<--------|--------->
所以我需要一種方法來將最大的數字湊到最接近的10,100,1000等等,並且用一種方法來決定滴答間隔。爲了使0可見,時間間隔必須分成四捨五入的數字,沒有餘數。
這是我到目前爲止。我知道這可能是一個更簡單的數學「純」方法。
//Find the max number rounded
double factor = 10d;
if (maxValue >= 1000)
factor = 1000d;
else if (maxValue >= 100)
factor = 100d;
var roundedMax = Convert.ToInt32(Math.Floor((maxValue.GetValueOrDefault() + factor)/factor) * factor);
if (roundedMax == 70 || roundedMax == 90)
roundedMax += 10;
else if (roundedMax == 700 || roundedMax == 900)
roundedMax += 100;
ViewModel.MaximumValue = roundedMax;
ViewModel.MinimumValue = roundedMax * -1;
//Work out the interval for tick marks
int interval;
var roundedMax = Convert.ToInt32(ViewModel.MaximumValue);
if (roundedMax <= 10)
interval = 2;
else if (roundedMax <= 20)
interval = 5;
else if (roundedMax <= 50)
interval = 10;
else if (roundedMax < 100)
interval = 20;
else if (roundedMax == 100)
interval = 25;
else if (roundedMax <= 200)
interval = 50;
else if (roundedMax <= 500)
interval = 100;
else if (roundedMax < 1000)
interval = 200;
else if (roundedMax == 1000)
interval = 250;
else if (roundedMax <= 2000)
interval = 500;
else
interval = 1000;
ViewModel.TickInterval = interval;
謝謝彼得。我用了一個稍微不同的解決方案,但使用了許多這些想法。 – user630190