@@ -82,15 +82,57 @@ MeasureAxis interpolate(const MeasureAxis &op0,
82
82
const auto s0 = op0.range .size ();
83
83
const auto s1 = op1.range .size ();
84
84
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) {
86
87
res.range = Math::Range<double >::Raw (
87
88
Math::interpolate (op0.range .getMin (),
88
89
op1.range .getMin (),
89
90
factor),
90
91
Math::interpolate (op0.range .getMax (),
91
92
op1.range .getMax (),
92
93
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));
94
136
}
95
137
else {
96
138
auto s0Inv = 1 / s0;
@@ -99,22 +141,22 @@ MeasureAxis interpolate(const MeasureAxis &op0,
99
141
const auto interp =
100
142
Math::interpolate (s0Inv, s1Inv, factor);
101
143
102
- const auto s = is_zero (interp) ? MAX : 1 / interp;
144
+ const auto size = is_zero (interp) ? MAX : 1 / interp;
103
145
104
146
res.range = Math::Range<double >::Raw (
105
147
Math::interpolate (op0.range .getMin () * s0Inv,
106
148
op1.range .getMin () * s1Inv,
107
149
factor)
108
- * s ,
150
+ * size ,
109
151
Math::interpolate (op0.range .getMax () * s0Inv,
110
152
op1.range .getMax () * s1Inv,
111
153
factor)
112
- * s );
154
+ * size );
113
155
114
156
auto step = Math::interpolate (op0.step .get () * s0Inv,
115
157
op1.step .get () * s1Inv,
116
158
factor)
117
- * s ;
159
+ * size ;
118
160
119
161
if (auto op0sign = std::signbit (op0.step .get ());
120
162
op0sign == std::signbit (op1.step .get ()))
@@ -166,7 +208,7 @@ bool DimensionAxis::add(const Data::SliceIndex &index,
166
208
}
167
209
values.emplace (std::piecewise_construct,
168
210
std::tuple{index },
169
- std::tuple{range, value, enabled });
211
+ std::tuple{range, value});
170
212
171
213
return true ;
172
214
}
0 commit comments