"网格吸附到值" - 自动缩放图表控件的实现细节





4.00/5 (6投票s)
计算具有最少小数位数的“SnapValues”,在自动缩放图表控件中很有用。
引言
我终于找到了一种算法来计算这个数字序列的成员
{... 0.02, 0.05, 0.1, 0.2, 0.5, 1, 2, 5, 10, 20, ...},它最接近给定的数字。
代码
''' <returns>
''' the to Number closest member of the sequence {... 0.5, 1, 2, 5, 10,...}
''' </returns>
Private Function GetSnapValue(ByVal Number As Double) As Double
'Int(Math.Log10(Val)): Comma-Position ( negative for: 0 < Number < 1 )
Dim DecimalRangeBottom As Double = 10 ^ Int(Math.Log10(Number))
Dim Numb As Double
Dim Prev As Double = DecimalRangeBottom
'tests 2-fold, 5-fold, 10-fold of DecimalRangeBottom
For Each Factor As Double In New Double() {2, 5, 10}
Numb = Factor * DecimalRangeBottom
If Numb >= Number Then Exit For
Prev = Numb
Next
'choose from Numb or Prev the closer one
If Numb - Number < Number - Prev Then
Return Numb
Else
Return Prev
End If
End Function
一个测试
Public Sub Main()
For I As Integer = -10 To 10
Dim Numb As Double = 63 ^ (I * 0.23)
Console.WriteLine(String.Format( _
"Number: {0,-22}SnapValue: {1,-5}", Numb, GetSnapValue(Numb)))
Next
Console.ReadLine()
End Sub
输出
Number: 7,26970413682593E-05 SnapValue: 5E-05
Number: 0,000188523312755006 SnapValue: 0,0002
Number: 0,000488892515887717 SnapValue: 0,0005
Number: 0,00126783201821641 SnapValue: 0,001
Number: 0,0032878352074914 SnapValue: 0,002
Number: 0,00852625599945599 SnapValue: 0,01
Number: 0,0221109139541476 SnapValue: 0,02
Number: 0,0573396477796245 SnapValue: 0,05
Number: 0,148697390542496 SnapValue: 0,1
Number: 0,38561300618949 SnapValue: 0,5
Number: 1 SnapValue: 1
Number: 2,59327352539712 SnapValue: 2
Number: 6,72506757752559 SnapValue: 5
Number: 17,4399397053036 SnapValue: 20
Number: 45,2265339222859 SnapValue: 50
Number: 117,284773066139 SnapValue: 100
Number: 304,151496924626 SnapValue: 200
Number: 788,748024684536 SnapValue: 1000
Number: 2045,43937062368 SnapValue: 2000
Number: 5304,38376764334 SnapValue: 5000
Number: 13755,7179931757 SnapValue: 10000
这对于自动缩放 ChartControl
非常有用,可以计算方向线的坐标,使得线条标题数字具有最少的小数位数。
Using the Code
它可能看起来像这样

图示的是不同大小的 Chartcontrol
中的相同图表。该控件进行了适当的自动缩放,以用图表填充整个可用空间,并且网格线使用空间增量以更高的精度进行计算。
无需用户输入即可使控件适应完全不同的值范围

就这些
CodeProject 上发布了比我的更强大的图表控件,但我没有检查是否有包含该功能的控件。
历史
- 2008 年 1 月 7 日:初始发布