use crate::js::math::{log10, max, pow10, round};
pub(crate) fn tick_step(span: f64, count: f64) -> f64 {
let raw = span / max(count, 1.0);
let power = log10(raw).floor();
let unit = raw / pow10(power);
let factor = if unit >= 7.07 {
10.0
} else if unit >= 3.16 {
5.0
} else if unit >= 1.41 {
2.0
} else {
1.0
};
if power < 0.0 {
-pow10(-power) / factor
} else {
factor * pow10(power)
}
}
pub(crate) fn tick_index(step: f64, value: f64) -> f64 {
if step > 0.0 {
value / step
} else {
value * -step
}
}
pub(crate) fn tick_value(step: f64, index: f64) -> f64 {
if step > 0.0 {
index * step
} else {
index / -step
}
}
pub(crate) fn ticks_between(lo: f64, hi: f64, step: f64) -> Vec<f64> {
let mut first = round(tick_index(step, lo));
if tick_value(step, first) < lo {
first += 1.0;
}
let mut last = round(tick_index(step, hi));
if tick_value(step, last) > hi {
last -= 1.0;
}
let mut out = Vec::new();
let mut i = first;
while i <= last && out.len() < 100 {
out.push(tick_value(step, i));
i += 1.0;
}
out
}