275 {
277
278
279 if (points.size() < 2) {
280
281 return vec2f(0.0f, 0.0f);
282 }
283
284
285 if (points.size() == 2) {
286 return vec2f(points[0].
x + alpha * (points[1].
x - points[0].
x),
287 points[0].
y + alpha * (points[1].
y - points[0].
y));
288 }
289
290
291
292 float scaledAlpha = alpha * (points.size() - 1);
293
294
295 int segment = static_cast<int>(scaledAlpha);
296
297
298 if (segment >= static_cast<int>(points.size()) - 1) {
299 segment = points.size() - 2;
300 scaledAlpha = static_cast<float>(segment) + 1.0f;
301 }
302
303
304 float t = scaledAlpha - static_cast<float>(segment);
305
306
307 vec2f p0, p1, p2, p3;
308
309
310 if (segment == 0) {
311
312 p0 = points[0];
313 p1 = points[0];
314 p2 = points[1];
315 p3 = (points.size() > 2) ? points[2] : points[1];
316 } else if (segment == static_cast<int>(points.size()) - 2) {
317
318 p0 = (segment > 0) ? points[segment - 1] : points[0];
319 p1 = points[segment];
320 p2 = points[segment + 1];
321 p3 = points[segment + 1];
322 } else {
323
324 p0 = points[segment - 1];
325 p1 = points[segment];
326 p2 = points[segment + 1];
327 p3 = points[segment + 2];
328 }
329
330
332 return out;
333}
HeapVector< vec2f > points
CatmullRomParams & params()
vec2f interpolate(const vec2f &p0, const vec2f &p1, const vec2f &p2, const vec2f &p3, float t) const