fix(figure): a following group keeps its whole window on the data
The offset of a following group was clamped to `retained` -- measured from the newest sample -- so a pan (or a zoom-in anchored near an edge) could put the window's *right* edge exactly on the oldest retained sample. That leaves the window's entire span to its left over data the scope never had: an empty margin as wide as the view. The bound is about the whole window, so it is `retained - span` -- but only while the window *can* sit on the data. When the members retain less than a window's worth (a ring still filling, or one just trimmed) nothing avoids a margin, and the older placement is the honest one and stays: right edge on the newest sample, the shortfall on the left. Test: a_following_group_keeps_its_whole_window_on_the_data -- asks to scroll ten spans past the oldest sample and asserts the window is still a window, with its left edge on the data. The existing `a_following_log_group_holds_decades` codified the old bound (`max == edge/10` after asking for a decade of pan with far less than that retained); its log-space subject is unchanged and the offset assertion is now the invariant above.
This commit is contained in:
1 parent
7dbe4e7183
commit
faef19ba60
4 files changed
+71
-6
No files matched your search
+12
-3
@@ -844,20 +844,29 @@ PLOT_TEST(a_following_log_group_holds_decades) {
|
||||
|
||||
// A member panned while the group follows: the adopted scroll state is the
|
||||
// adopted range's span *in decades* -- two here (edge/1000 to edge/10 is a
|
||||
// factor of 100) -- and the offset one decade behind the edge, both of which
|
||||
// survive the next frames' advances.
|
||||
// factor of 100) -- and the offset as far behind the edge as the retained data
|
||||
// allows, both of which survive the next frames' advances.
|
||||
//
|
||||
// The pan *asks* for a full decade back, and the group may not take it: the offset is bounded by
|
||||
// `retained - span`, so the window stops with its left edge on the oldest sample. Asserting
|
||||
// `max == edge/10` here was asserting the *old* bound, which put a whole span of the window over
|
||||
// data the members never held -- the empty-left-margin defect this bound exists for. The
|
||||
// log-space assertions above are this test's subject and are unchanged.
|
||||
const plot::f64 edge = left.x_bounds().max;
|
||||
figure.plot(1u).set_x_range(0u, {edge / 1000.0, edge / 10.0});
|
||||
figure.layout();
|
||||
PLOT_CHECK_NEAR(decades_of(figure.plot(0u)), 2.0, 1e-9);
|
||||
PLOT_CHECK_NEAR(decades_of(figure.plot(1u)), 2.0, 1e-9);
|
||||
PLOT_CHECK_NEAR(figure.plot(0u).x_range(0u).max, edge / 10.0, 1e-8);
|
||||
const plot::f64 oldest = std::min(left.x_bounds().min, right.x_bounds().min);
|
||||
PLOT_CHECK(figure.plot(0u).x_range(0u).min >= oldest - 1e-6);
|
||||
PLOT_CHECK(figure.plot(0u).x_range(0u).max <= edge + 1e-6);
|
||||
for (int step = 0; step < 3; ++step) {
|
||||
left.push(0.5f);
|
||||
left.acquire();
|
||||
figure.layout();
|
||||
PLOT_CHECK_NEAR(decades_of(figure.plot(0u)), 2.0, 1e-9);
|
||||
PLOT_CHECK_NEAR(decades_of(figure.plot(1u)), 2.0, 1e-9);
|
||||
PLOT_CHECK(figure.plot(0u).x_range(0u).min >= oldest - 1e-6);
|
||||
}
|
||||
PLOT_CHECK(figure.x_link_follow(group) == plot::XFollow::Live);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user