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
#[derive(Debug)]
pub struct Scale {
    pub min: i64,
    pub max: i64,
    pub ticks: Vec<i64>,
}
impl Scale {
    pub fn new(mut min: i64, mut max: i64) -> Self {
        debug_assert!(min <= max);
        if max < min + 3 {
            max += 2;
            min -= 2;
        }
        if min > 0 && (max - min) * 4 > max {
            min = 0;
        }
        let l = ((max - min) as f64).log10().floor() as u32;
        let d = 10i64.pow(l);
        min = (min / d) * d;
        let mut tick = min;
        let mut ticks = vec![tick];
        loop {
            tick += d;
            ticks.push(tick);
            if tick > max {
                break;
            }
        }
        max = ticks[ticks.len() - 1];
        Self { min, max, ticks }
    }
    pub fn range(&self) -> i64 {
        self.max - self.min
    }
}