// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package scale // A Quantative scale is an invertible function from some continuous // input domain to an output range of [0, 1]. type Quantitative interface { // Map maps from a value x in the input domain to [0, 1]. If x // is outside the input domain and clamping is enabled, x will // first be clamped to the input domain. Map(x float64) float64 // Unmap is the inverse of Map. That is, if x is in the input // domain or clamping is disabled, x = Unmap(Map(x)). If // clamping is enabled and y is outside [0,1], the results are // undefined. Unmap(y float64) float64 // SetClamp sets the clamping mode of this scale. SetClamp(bool) // Ticks returns major and minor ticks that satisfy the // constraints given by o. These ticks will have "nice" values // within the input domain. Both arrays are sorted in // ascending order and minor includes ticks in major. Ticks(o TickOptions) (major, minor []float64) // Nice expands the input domain of this scale to "nice" // values for covering the input domain satisfying the // constraints given by o. After calling Nice(o), the first // and last major ticks returned by Ticks(o) will equal the // lower and upper bounds of the input domain. Nice(o TickOptions) // A Quantitative scale is also a Ticker. Ticker } // A QQ maps from a source Quantitative scale to a destination // Quantitative scale. type QQ struct { Src, Dest Quantitative } // Map maps from a value x in the source scale's input domain to a // value y in the destination scale's input domain. func (q QQ) Map(x float64) float64 { return q.Dest.Unmap(q.Src.Map(x)) } // Unmap maps from a value y in the destination scale's input domain to // a value x in the source scale's input domain. func (q QQ) Unmap(x float64) float64 { return q.Src.Unmap(q.Dest.Map(x)) }