use std::ops::Range;
pub struct Scale {
domain: Range<f32>,
range: Range<f32>,
}
impl Scale {
pub fn linear(&self, x: f32) -> f32 {
let p = (x - self.domain.start) / (self.domain.end - self.domain.start);
let r = self.range.start + p * (self.range.end - self.range.start);
r.clamp(self.range.start, self.range.end)
}
pub fn inv_linear(&self, i: f32) -> f32 {
let p = (i - self.range.start) / (self.range.end - self.range.start);
let d = self.domain.start + p * (self.domain.end - self.domain.start);
d.clamp(self.domain.start, self.domain.end)
}
pub fn new(domain: Range<f32>, range: Range<f32>) -> Self {
Scale { domain, range }
}
}