@@ -82,15 +82,57 @@ MeasureAxis interpolate(const MeasureAxis &op0,
8282 const auto s0 = op0.range .size ();
8383 const auto s1 = op1.range .size ();
8484
85- if (auto s0Zero = is_zero (s0); s0Zero || is_zero (s1)) {
85+ if (auto s0Zero = is_zero (s0), s1Zero = is_zero (s1);
86+ s0Zero && s1Zero) {
8687 res.range = Math::Range<double >::Raw (
8788 Math::interpolate (op0.range .getMin (),
8889 op1.range .getMin (),
8990 factor),
9091 Math::interpolate (op0.range .getMax (),
9192 op1.range .getMax (),
9293 factor));
93- res.step = s0Zero ? op1.step : op0.step ;
94+ res.step = interpolate (op0.step , op1.step , factor);
95+ }
96+ else if (s1Zero) {
97+ auto size = factor == 1.0 ? MAX : s0 / (1 - factor);
98+
99+ auto middleAt = Math::interpolate (
100+ op0.range .rescale (op1.range .middle ()),
101+ 0.0 ,
102+ factor);
103+
104+ res.range = Math::Range<double >::Raw (
105+ op1.range .middle () - middleAt * size,
106+ op1.range .middle ()
107+ + (factor == 1.0 ? 0.0 : (1 - middleAt) * size));
108+
109+ auto step = op0.step .get () / s0 * size;
110+ auto max = std::copysign (MAX, step);
111+
112+ res.step = interpolate (op0.step ,
113+ Anim::Interpolated{max},
114+ Math::Range<double >::Raw (op0.step .get (), max)
115+ .rescale (step));
116+ }
117+ else if (s0Zero) {
118+ auto size = factor == 0.0 ? MAX : s1 / factor;
119+
120+ auto middleAt = Math::interpolate (0.0 ,
121+ op1.range .rescale (op0.range .middle ()),
122+ factor);
123+
124+ res.range = Math::Range<double >::Raw (
125+ op0.range .middle () - middleAt * size,
126+ op0.range .middle ()
127+ + (factor == 0.0 ? 0.0 : (1 - middleAt) * size));
128+
129+ auto step = op1.step .get () / s1 * size;
130+ auto max = std::copysign (MAX, step);
131+
132+ res.step = interpolate (op1.step ,
133+ Anim::Interpolated{max},
134+ Math::Range<double >::Raw (op1.step .get (), max)
135+ .rescale (step));
94136 }
95137 else {
96138 auto s0Inv = 1 / s0;
@@ -99,22 +141,22 @@ MeasureAxis interpolate(const MeasureAxis &op0,
99141 const auto interp =
100142 Math::interpolate (s0Inv, s1Inv, factor);
101143
102- const auto s = is_zero (interp) ? MAX : 1 / interp;
144+ const auto size = is_zero (interp) ? MAX : 1 / interp;
103145
104146 res.range = Math::Range<double >::Raw (
105147 Math::interpolate (op0.range .getMin () * s0Inv,
106148 op1.range .getMin () * s1Inv,
107149 factor)
108- * s ,
150+ * size ,
109151 Math::interpolate (op0.range .getMax () * s0Inv,
110152 op1.range .getMax () * s1Inv,
111153 factor)
112- * s );
154+ * size );
113155
114156 auto step = Math::interpolate (op0.step .get () * s0Inv,
115157 op1.step .get () * s1Inv,
116158 factor)
117- * s ;
159+ * size ;
118160
119161 if (auto op0sign = std::signbit (op0.step .get ());
120162 op0sign == std::signbit (op1.step .get ()))
@@ -166,7 +208,7 @@ bool DimensionAxis::add(const Data::SliceIndex &index,
166208 }
167209 values.emplace (std::piecewise_construct,
168210 std::tuple{index},
169- std::tuple{range, value, enabled });
211+ std::tuple{range, value});
170212
171213 return true ;
172214}
0 commit comments