feat(plot): an axis can write its labels relative to an origin, and time scales by prefix
A host zooming into a sub-second window cannot label it absolutely: Time formatting uses three significant digits, so 12.345671s and 12.345672s are the same string and a 1 ms step around a multi-second time is unlabelled. The axis gains an `origin`: every value it writes is `v - origin`, and the ticks are generated on the shifted grid, so the window reads 0, 500us, 1ms. `origin_follows_range` re-takes the origin from the axis' own range on every refresh -- the mode a *moving* window needs, since the edge is derived from the newest sample at layout time and a value the host wrote a frame earlier is a frame of scroll stale. `format_time` now scales its sub-second values by prefix, the way `format_si` does on a y axis: the unit that keeps the mantissa in [1, 1000). A fixed millisecond unit printed 0.005ms where 5us is the reading, and 1e-05ms where 10ns is. An exact zero prints `0`, the same convention `format_si` states. The origin subtraction's dust is snapped by a *relative* epsilon, so a tick on the origin reads 0 rather than 1.78e-12ms. Tested by `ticks_are_written_relative_to_an_axis_origin`, `a_range_origin_puts_the_zero_tick_on_the_left_edge` and the extended `format_time_shapes`; the suite is 359 cases, 0 failed.
This commit is contained in:
1 parent
211c5b97bc
commit
2dcd1f1864
7 files changed
+197
-14
No files matched your search
@@ -48,7 +48,10 @@ void format_si(f64 v, char* buf, usize n, const char* unit = nullptr);
|
||||
/// field is derived from that one number, so no field can ever reach its radix:
|
||||
/// 119.5 s is `2:00`, not `1:60`, and 3599.5 s is `1:00:00`.
|
||||
///
|
||||
/// Shapes, by magnitude: below 1 s `500ms`; below 60 s `1.5s`; below 1 h `1:30`;
|
||||
/// Shapes, by magnitude: below 1 s the prefixed unit that keeps the mantissa in
|
||||
/// `[1, 1000)` -- `500ms`, `5ms`, `500us`, `5us`, `5ns`, `5ps` (the micro sign is
|
||||
/// UTF-8 U+00B5, as in `format_si`) -- with an exact zero printed as `0` rather
|
||||
/// than as a zero of some unit; below 60 s `1.5s`; below 1 h `1:30`;
|
||||
/// at or above 24 h, as a decimal day count `2.5d`. Between 1 h and 24 h the
|
||||
/// shape is `1:01:01` -- and because a value that rounds up to 24 h takes the day
|
||||
/// shape, the hour field of that shape is always below 24. The 60 s and 1 h
|
||||
@@ -87,6 +90,6 @@ inline constexpr usize kMaxTicks = 256;
|
||||
/// single-sample series), a non-positive `px` or `min_px`, and a span whose step
|
||||
/// overflows to infinity.
|
||||
void generate_ticks(Range range, f32 px, f32 min_px, std::vector<Tick>& out,
|
||||
bool include_minors = false);
|
||||
bool include_minors = false, f64 origin = 0.0);
|
||||
|
||||
} // namespace plot
|
||||
Reference in new issue
Block a user