go-chart/range.go

45 lines
1.1 KiB
Go
Raw Normal View History

2016-07-07 03:54:00 +02:00
package chart
import (
2016-07-07 23:44:03 +02:00
"fmt"
2016-07-07 03:54:00 +02:00
"math"
)
2016-07-10 10:11:47 +02:00
// Range represents a boundary for a set of numbers.
2016-07-07 23:44:03 +02:00
type Range struct {
2016-07-10 10:11:47 +02:00
Min float64
Max float64
Domain int
2016-07-07 03:54:00 +02:00
}
2016-07-07 23:44:03 +02:00
// IsZero returns if the range has been set or not.
func (r Range) IsZero() bool {
return (r.Min == 0 || math.IsNaN(r.Min)) &&
(r.Max == 0 || math.IsNaN(r.Max)) &&
r.Domain == 0
2016-07-07 03:54:00 +02:00
}
2016-07-07 23:44:03 +02:00
// Delta returns the difference between the min and max value.
func (r Range) Delta() float64 {
return r.Max - r.Min
2016-07-07 03:54:00 +02:00
}
2016-07-07 23:44:03 +02:00
// String returns a simple string for the range.
func (r Range) String() string {
return fmt.Sprintf("Range [%.2f,%.2f] => %d", r.Min, r.Max, r.Domain)
2016-07-07 03:54:00 +02:00
}
// Translate maps a given value into the range space.
2016-07-07 23:44:03 +02:00
func (r Range) Translate(value float64) int {
2016-07-12 03:48:51 +02:00
normalized := value - r.Min
ratio := normalized / r.Delta()
return int(math.Ceil(ratio * float64(r.Domain)))
}
// GetRoundedRangeBounds returns some `prettified` range bounds.
func (r Range) GetRoundedRangeBounds() (min, max float64) {
delta := r.Max - r.Min
roundTo := GetRoundToForDelta(delta)
return RoundDown(r.Min, roundTo), RoundUp(r.Max, roundTo)
2016-07-07 03:54:00 +02:00
}