MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
MotionCurves.hpp
Go to the documentation of this file.
1#pragma once
2
4#include <Eigen/Dense>
5
6namespace MayaFlux::Kinesis {
7
8/**
9 * @enum InterpolationMode
10 * @brief Mathematical interpolation methods
11 */
12enum class InterpolationMode : uint8_t {
13 LINEAR,
18 BSPLINE,
19 COSINE,
20 CUSTOM
21};
22
23/**
24 * @brief Catmull-Rom spline interpolation using Eigen matrices
25 * @param control_points 4xN matrix where columns are control points (p0, p1, p2, p3)
26 * @param t Parameter in [0,1]
27 * @param tension Tension parameter (default 0.5)
28 * @return Interpolated point as Nx1 vector
29 */
30Eigen::VectorXd catmull_rom_spline(
31 const Eigen::MatrixXd& control_points,
32 double t,
33 double tension = 0.5);
34
35/**
36 * @brief Cubic Bezier interpolation using Eigen matrices
37 * @param control_points 4xN matrix where columns are control points
38 * @param t Parameter in [0,1]
39 * @return Interpolated point as Nx1 vector
40 */
41Eigen::VectorXd cubic_bezier(
42 const Eigen::MatrixXd& control_points,
43 double t);
44
45/**
46 * @brief Quadratic Bezier interpolation using Eigen matrices
47 * @param control_points 3xN matrix where columns are control points
48 * @param t Parameter in [0,1]
49 * @return Interpolated point as Nx1 vector
50 */
51Eigen::VectorXd quadratic_bezier(
52 const Eigen::MatrixXd& control_points,
53 double t);
54
55/**
56 * @brief Cubic Hermite interpolation using Eigen matrices
57 * @param endpoints 2xN matrix (start, end)
58 * @param tangents 2xN matrix (tangent_start, tangent_end)
59 * @param t Parameter in [0,1]
60 * @return Interpolated point as Nx1 vector
61 */
62Eigen::VectorXd cubic_hermite(
63 const Eigen::MatrixXd& endpoints,
64 const Eigen::MatrixXd& tangents,
65 double t);
66
67/**
68 * @brief Uniform B-spline interpolation using Eigen matrices
69 * @param control_points 4xN matrix where columns are control points
70 * @param t Parameter in [0,1]
71 * @return Interpolated point as Nx1 vector
72 */
73Eigen::VectorXd bspline_cubic(
74 const Eigen::MatrixXd& control_points,
75 double t);
76
77/**
78 * @brief Generic interpolation dispatcher
79 * @param control_points MxN matrix where columns are control points
80 * @param t Parameter in [0,1]
81 * @param mode Interpolation mode
82 * @param tension Tension parameter (for applicable modes)
83 * @return Interpolated point as Nx1 vector
84 */
85Eigen::VectorXd interpolate(
86 const Eigen::MatrixXd& control_points,
87 double t,
89 double tension = 0.5);
90
91/**
92 * @brief Generate interpolated points from control points
93 * @param control_points MxN matrix where columns are control points
94 * @param num_samples Number of interpolated points to generate
95 * @param mode Interpolation mode
96 * @param tension Tension parameter
97 * @return Matrix where columns are interpolated points
98 */
99Eigen::MatrixXd generate_interpolated_points(
100 const Eigen::MatrixXd& control_points,
101 Eigen::Index num_samples,
103 double tension = 0.5);
104
105/**
106 * @brief Compute arc length of curve using trapezoidal rule
107 * @param points Columns are sequential points along curve
108 * @return Estimated arc length
109 */
110double compute_arc_length(const Eigen::MatrixXd& points);
111
112/**
113 * @brief Compute arc length parameterization table
114 * @param points Columns are sequential points along curve
115 * @return Vector of cumulative arc lengths
116 */
117Eigen::VectorXd compute_arc_length_table(const Eigen::MatrixXd& points);
118
119/**
120 * @brief Reparameterize curve by arc length
121 * @param points Original points (columns)
122 * @param num_samples Number of output samples
123 * @return Arc-length parameterized points
124 */
125Eigen::MatrixXd reparameterize_by_arc_length(
126 const Eigen::MatrixXd& points,
127 Eigen::Index num_samples);
128
129/**
130 * @brief Process DataVariant through interpolation
131 * @param control_points Input data as control points
132 * @param num_samples Number of output samples
133 * @param mode Interpolation mode
134 * @param tension Tension parameter
135 * @return Interpolated data
136 */
138 const Kakshya::DataVariant& control_points,
139 Eigen::Index num_samples,
141 double tension = 0.5);
142
143} // namespace MayaFlux::Kinesis
std::variant< std::vector< double >, std::vector< float >, std::vector< uint8_t >, std::vector< uint16_t >, std::vector< uint32_t >, std::vector< std::complex< float > >, std::vector< std::complex< double > >, std::vector< glm::vec2 >, std::vector< glm::vec3 >, std::vector< glm::vec4 >, std::vector< glm::mat4 > > DataVariant
Multi-type data storage for different precision needs.
Definition NDData.hpp:73
std::vector< Nodes::LineVertex > reparameterize_by_arc_length(const std::vector< Nodes::LineVertex > &path_vertices, size_t num_samples)
Resample path vertices for arc-length parameterization.
Eigen::MatrixXd generate_interpolated_points(const Eigen::MatrixXd &control_points, Eigen::Index num_samples, InterpolationMode mode, double tension)
Generate interpolated points from control points.
InterpolationMode
Mathematical interpolation methods.
Eigen::VectorXd interpolate(const Eigen::MatrixXd &control_points, double t, InterpolationMode mode, double tension)
Generic interpolation dispatcher.
Eigen::VectorXd bspline_cubic(const Eigen::MatrixXd &control_points, double t)
Uniform B-spline interpolation using Eigen matrices.
double compute_arc_length(const Eigen::MatrixXd &points)
Compute arc length of curve using trapezoidal rule.
Eigen::VectorXd cubic_hermite(const Eigen::MatrixXd &endpoints, const Eigen::MatrixXd &tangents, double t)
Cubic Hermite interpolation using Eigen matrices.
Eigen::VectorXd cubic_bezier(const Eigen::MatrixXd &control_points, double t)
Cubic Bezier interpolation using Eigen matrices.
Kakshya::DataVariant interpolate_nddata(const Kakshya::DataVariant &control_points, Eigen::Index num_samples, InterpolationMode mode, double tension)
Process DataVariant through interpolation.
Eigen::VectorXd compute_arc_length_table(const Eigen::MatrixXd &points)
Compute arc length parameterization table.
Eigen::VectorXd quadratic_bezier(const Eigen::MatrixXd &control_points, double t)
Quadratic Bezier interpolation using Eigen matrices.
Eigen::VectorXd catmull_rom_spline(const Eigen::MatrixXd &control_points, double t, double tension)
Catmull-Rom spline interpolation using Eigen matrices.