csv2svg/
scale.rs

1#[derive(Debug)]
2pub struct Scale {
3    pub min: i64,
4    pub max: i64,
5    pub ticks: Vec<i64>,
6}
7impl Scale {
8    pub fn new(mut min: i64, mut max: i64) -> Self {
9        debug_assert!(min <= max);
10        if max < min + 3 {
11            max += 2;
12            min -= 2;
13        }
14        if min > 0 && (max - min) * 4 > max {
15            min = 0;
16        }
17        let l = ((max - min) as f64).log10().floor() as u32;
18        let d = 10i64.pow(l);
19        min = (min / d) * d;
20        let mut tick = min;
21        let mut ticks = vec![tick];
22        loop {
23            tick += d;
24            ticks.push(tick);
25            if tick > max {
26                break;
27            }
28        }
29        max = ticks[ticks.len() - 1];
30        Self { min, max, ticks }
31    }
32    pub fn range(&self) -> i64 {
33        self.max - self.min
34    }
35}