|
import {linearish} from "./linear.js"; |
|
import {copy, identity, transformer} from "./continuous.js"; |
|
import {initRange} from "./init.js"; |
|
|
|
function transformPow(exponent) { |
|
return function(x) { |
|
return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent); |
|
}; |
|
} |
|
|
|
function transformSqrt(x) { |
|
return x < 0 ? -Math.sqrt(-x) : Math.sqrt(x); |
|
} |
|
|
|
function transformSquare(x) { |
|
return x < 0 ? -x * x : x * x; |
|
} |
|
|
|
export function powish(transform) { |
|
var scale = transform(identity, identity), |
|
exponent = 1; |
|
|
|
function rescale() { |
|
return exponent === 1 ? transform(identity, identity) |
|
: exponent === 0.5 ? transform(transformSqrt, transformSquare) |
|
: transform(transformPow(exponent), transformPow(1 / exponent)); |
|
} |
|
|
|
scale.exponent = function(_) { |
|
return arguments.length ? (exponent = +_, rescale()) : exponent; |
|
}; |
|
|
|
return linearish(scale); |
|
} |
|
|
|
export default function pow() { |
|
var scale = powish(transformer()); |
|
|
|
scale.copy = function() { |
|
return copy(scale, pow()).exponent(scale.exponent()); |
|
}; |
|
|
|
initRange.apply(scale, arguments); |
|
|
|
return scale; |
|
} |
|
|
|
export function sqrt() { |
|
return pow.apply(null, arguments).exponent(0.5); |
|
} |
|
|