Nice Label Algorithm for Charts with minimum ticks

后端 未结 16 2080
清酒与你
清酒与你 2020-11-29 17:07

I need to calculate the Ticklabels and the Tickrange for charts manually.

I know the \"standard\" algorithm for nice ticks (see http://books.google.de/books?id=fvA7

16条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-29 17:45

    This is the VB.NET version.

    Public Class NiceScale
    
    Private minPoint As Double
    Private maxPoint As Double
    Private maxTicks As Double = 10
    Private tickSpacing
    Private range As Double
    Private niceMin As Double
    Private niceMax As Double
    
    Public Sub New(min As Double, max As Double)
        minPoint = min
        maxPoint = max
        calculate()
    End Sub
    
    Private Sub calculate()
        range = niceNum(maxPoint - minPoint, False)
        tickSpacing = niceNum(range / (maxTicks - 1), True)
        niceMin = Math.Floor(minPoint / tickSpacing) * tickSpacing
        niceMax = Math.Ceiling(maxPoint / tickSpacing) * tickSpacing
    End Sub
    
    Private Function niceNum(range As Double, round As Boolean) As Double
        Dim exponent As Double '/** exponent of range */
        Dim fraction As Double '/** fractional part of range */
        Dim niceFraction As Double '/** nice, rounded fraction */
    
        exponent = Math.Floor(Math.Log10(range))
        fraction = range / Math.Pow(10, exponent)
    
        If round Then
            If (fraction < 1.5) Then
                niceFraction = 1
            ElseIf (fraction < 3) Then
                niceFraction = 2
            ElseIf (fraction < 7) Then
                niceFraction = 5
            Else
                niceFraction = 10
            End If
        Else
            If (fraction <= 1) Then
                niceFraction = 1
            ElseIf (fraction <= 2) Then
                niceFraction = 2
            ElseIf (fraction <= 5) Then
                niceFraction = 5
            Else
                niceFraction = 10
            End If
        End If
    
        Return niceFraction * Math.Pow(10, exponent)
    End Function
    
    Public Sub setMinMaxPoints(minPoint As Double, maxPoint As Double)
        minPoint = minPoint
        maxPoint = maxPoint
        calculate()
    End Sub
    
    Public Sub setMaxTicks(maxTicks As Double)
        maxTicks = maxTicks
        calculate()
    End Sub
    
    Public Function getTickSpacing() As Double
        Return tickSpacing
    End Function
    
    Public Function getNiceMin() As Double
        Return niceMin
    End Function
    
    Public Function getNiceMax() As Double
        Return niceMax
    End Function
    
    End Class
    

提交回复
热议问题