65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (6投票s)

2008年1月7日

CPOL
viewsIcon

27913

downloadIcon

199

计算具有最少小数位数的“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

它可能看起来像这样

AutoscaleChart

AutoscaleChart_2.gif

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

无需用户输入即可使控件适应完全不同的值范围

AutoscaleChart_4.gif

就这些

CodeProject 上发布了比我的更强大的图表控件,但我没有检查是否有包含该功能的控件。

历史

  • 2008 年 1 月 7 日:初始发布
© . All rights reserved.