Generic interpolation dispatcher.
490{
492 case InterpolationMode::LINEAR:
493 if (control_points.cols() < 2) {
494 error<std::invalid_argument>(
495 Journal::Component::Kinesis,
496 Journal::Context::Runtime,
497 std::source_location::current(),
498 "Linear interpolation requires at least 2 points, but got {}",
499 control_points.cols());
500 }
501 return (1.0 - t) * control_points.col(0) + t * control_points.col(1);
502
503 case InterpolationMode::CATMULL_ROM:
504 return catmull_rom_spline(control_points, t, tension);
505
506 case InterpolationMode::RADIAL_FAN_CUBIC:
507 return radial_fan_cubic(control_points, t, tension);
508
509 case InterpolationMode::CUBIC_HERMITE: {
510 Eigen::MatrixXd endpoints = control_points.leftCols(2);
511 Eigen::MatrixXd tangents = control_points.rightCols(2);
512 return cubic_hermite(endpoints, tangents, t);
513 }
514
515 case InterpolationMode::CUBIC_BEZIER:
516 return cubic_bezier(control_points, t);
517
518 case InterpolationMode::QUADRATIC_BEZIER:
519 return quadratic_bezier(control_points, t);
520
521 case InterpolationMode::BSPLINE:
522 return bspline_cubic(control_points, t);
523
524 case InterpolationMode::COSINE: {
525 if (control_points.cols() < 2) {
526 error<std::invalid_argument>(
527 Journal::Component::Kinesis,
528 Journal::Context::Runtime,
529 std::source_location::current(),
530 "Cosine interpolation requires at least 2 points, but got {}",
531 control_points.cols());
532 }
533 double mu2 = (1.0 - std::cos(t * M_PI)) * 0.5;
534 return (1.0 - mu2) * control_points.col(0) + mu2 * control_points.col(1);
535 }
536
537 default:
538 error<std::invalid_argument>(
539 Journal::Component::Kinesis,
540 Journal::Context::Runtime,
541 std::source_location::current(),
542 "Unsupported interpolation mode: {}",
543 static_cast<int>(
mode));
544 }
545}