MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches

◆ generate_interpolated_points()

Eigen::MatrixXd MayaFlux::Kinesis::generate_interpolated_points ( const Eigen::MatrixXd &  control_points,
Eigen::Index  num_samples,
InterpolationMode  mode,
double  tension = 0.5 
)

Generate interpolated points from control points.

Parameters
control_pointsMxN matrix where columns are control points
num_samplesNumber of interpolated points to generate
modeInterpolation mode
tensionTension parameter
Returns
Matrix where columns are interpolated points

Definition at line 321 of file MotionCurves.cpp.

326{
327 if (num_samples < 2) {
328 error<std::invalid_argument>(
329 Journal::Component::Kinesis,
330 Journal::Context::Runtime,
331 std::source_location::current(),
332 "num_samples must be at least 2, but got {}",
333 num_samples);
334 }
335
336 if (control_points.cols() < 2) {
337 error<std::invalid_argument>(
338 Journal::Component::Kinesis,
339 Journal::Context::Runtime,
340 std::source_location::current(),
341 "Need at least 2 control points, but got {}",
342 control_points.cols());
343 }
344
345 auto [points_per_segment, overlap, supports_multi] = get_segment_info(mode);
346
347 if (!supports_multi) {
348 if (control_points.cols() != points_per_segment) {
349 error<std::invalid_argument>(
350 Journal::Component::Kinesis,
351 Journal::Context::Runtime,
352 std::source_location::current(),
353 "{} interpolation requires exactly {} control points, but got {}",
354 static_cast<int>(mode), points_per_segment, control_points.cols());
355 }
356 return interpolate_single_segment(control_points, num_samples, mode, tension);
357 }
358
359 if (control_points.cols() == points_per_segment) {
360 return interpolate_single_segment(control_points, num_samples, mode, tension);
361 }
362
363 ExtendedControls extended(control_points, mode, points_per_segment);
364 Eigen::Index num_segments = compute_num_segments(extended.count, points_per_segment, overlap);
365
366 if (num_segments < 1) {
367 error<std::invalid_argument>(
368 Journal::Component::Kinesis,
369 Journal::Context::Runtime,
370 std::source_location::current(),
371 "Need sufficient control points for multi-segment {} interpolation, but got {}",
372 static_cast<int>(mode), control_points.cols());
373 }
374
375 Eigen::MatrixXd result(control_points.rows(), num_samples);
376
377 for (Eigen::Index i = 0; i < num_samples; ++i) {
378 auto [seg_idx, t_local] = SegmentLocation::compute(i, num_samples, num_segments);
379
380 Eigen::MatrixXd segment_controls = extract_segment_controls(
381 *extended.controls,
382 extended.count,
383 seg_idx,
385 overlap,
386 t_local);
387
388 result.col(i) = interpolate(segment_controls, t_local, mode, tension);
389 }
390
391 return result;
392}
double t_local
Eigen::Index points_per_segment
Eigen::Index overlap
bool supports_multi
Eigen::Index seg_idx
Eigen::VectorXd interpolate(const Eigen::MatrixXd &control_points, double t, InterpolationMode mode, double tension)
Generic interpolation dispatcher.

References interpolate(), MayaFlux::Journal::Kinesis, overlap, points_per_segment, MayaFlux::Journal::Runtime, seg_idx, supports_multi, and t_local.

Referenced by MayaFlux::Nodes::GpuSync::TopologyGeneratorNode::build_interpolated_path(), MayaFlux::Nodes::GpuSync::PathGeneratorNode::generate_curve_segment(), and interpolate_nddata().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: