1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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.max(self.range.start).min(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.max(self.domain.start).min(self.domain.end)
}
pub fn new(domain: Range<f32>, range: Range<f32>) -> Self {
Scale { domain, range }
}
}