32 const Eigen::MatrixXd& control_points,
34 double tension = 0.5);
44 const Eigen::MatrixXd& control_points,
46 double tension = 0.5);
55 const Eigen::MatrixXd& control_points,
65 const Eigen::MatrixXd& control_points,
76 const Eigen::MatrixXd& endpoints,
77 const Eigen::MatrixXd& tangents,
87 const Eigen::MatrixXd& control_points,
99 const Eigen::MatrixXd& control_points,
102 double tension = 0.5);
120 std::span<const double>
points,
123 std::vector<double>& tangents);
187 double tension = 0.5);
200 [[nodiscard]]
double tension()
const {
return m_tension; }
224 void evaluate_planar(
225 std::span<const double> control_points,
227 Eigen::Index num_samples,
228 std::vector<double>&
out,
229 std::vector<double>& tangents);
243 void reparameterize_planar(
244 std::span<const double>
points,
246 Eigen::Index point_count,
247 Eigen::Index num_samples,
248 std::vector<double>&
out);
259 const Eigen::MatrixXd& control_points,
260 Eigen::Index num_samples,
261 Eigen::MatrixXd&
out);
273 const Eigen::MatrixXd&
points,
274 Eigen::Index num_samples,
275 Eigen::MatrixXd&
out);
282 Eigen::Index m_points_per_segment { 0 };
283 Eigen::Index m_overlap { 0 };
284 bool m_supports_multi {
false };
285 bool m_trigonometric {
false };
302 void rebuild_kernel();
304 const double* extend(
305 std::span<const double> control_points,
307 Eigen::Index&
count);
310 Eigen::Index num_samples,
311 Eigen::Index num_segments,
312 Eigen::Index active_count);
324 const Eigen::MatrixXd& control_points,
325 Eigen::Index num_samples,
327 double tension = 0.5);
350 const Eigen::MatrixXd&
points,
351 Eigen::Index num_samples);
363 Eigen::Index num_samples,
365 double tension = 0.5);
std::vector< glm::vec2 > * points
std::vector< float > * out
std::vector< double > m_dfolded
std::vector< double > m_tbuf
std::vector< double > m_planar
InterpolationMode mode() const
Currently configured mode.
std::vector< Eigen::Index > m_seg_total
std::vector< double > m_planar_alt
double tension() const
Currently configured tension.
std::vector< double > m_extended
std::vector< double > m_basis
std::vector< size_t > m_lower
std::vector< CurveChunk > m_chunks
std::vector< Eigen::Index > m_seg_first
std::vector< double > m_folded
std::vector< double > m_planar_tangents
std::vector< double > m_arc
std::vector< double > m_frac
Reusable interpolation state for callers evaluating many curves.
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.
double compute_arc_length(const Eigen::MatrixXd &points)
Compute arc length of curve using trapezoidal rule.
InterpolationMode
Mathematical interpolation methods.
Eigen::VectorXd bspline_cubic(const Eigen::MatrixXd &control_points, double t)
Uniform B-spline interpolation using Eigen matrices.
Eigen::VectorXd cubic_bezier(const Eigen::MatrixXd &control_points, double t)
Cubic Bezier interpolation using Eigen matrices.
Eigen::VectorXd quadratic_bezier(const Eigen::MatrixXd &control_points, double t)
Quadratic Bezier interpolation using Eigen matrices.
void central_difference_tangents(std::span< const double > points, size_t dim, size_t count, std::vector< double > &tangents)
Tangents of a sampled curve by finite difference, coordinate-major.
Eigen::VectorXd catmull_rom_spline(const Eigen::MatrixXd &control_points, double t, double tension)
Catmull-Rom spline interpolation using Eigen matrices.
Eigen::MatrixXd generate_interpolated_points(const Eigen::MatrixXd &control_points, Eigen::Index num_samples, InterpolationMode mode, double tension)
Generate interpolated points from control points.
Eigen::VectorXd compute_arc_length_table(const Eigen::MatrixXd &points)
Compute arc length parameterization table.
Kakshya::DataVariant interpolate_nddata(const Kakshya::DataVariant &control_points, Eigen::Index num_samples, InterpolationMode mode, double tension)
Process DataVariant through interpolation.
std::vector< Kakshya::LineVertex > reparameterize_by_arc_length(const std::vector< Kakshya::LineVertex > &path_vertices, size_t num_samples)
Resample path vertices for arc-length parameterization.
Eigen::VectorXd cubic_hermite(const Eigen::MatrixXd &endpoints, const Eigen::MatrixXd &tangents, double t)
Cubic Hermite interpolation using Eigen matrices.
Eigen::VectorXd interpolate(const Eigen::MatrixXd &control_points, double t, InterpolationMode mode, double tension)
Generic interpolation dispatcher.
Eigen::VectorXd radial_fan_cubic(const Eigen::MatrixXd &control_points, double t, double tension)
Origin-oriented cubic sweep from tension * (p0 - p1) to p3.
Eigen::Index start_col
First control point of the owning segment.
Eigen::Index sample_count
Output sample count.
Eigen::Index sample_begin
First output sample.
bool clamp_t_high
Segment pinned to t = 1 by the control clamp.
Eigen::Index segment
Owning segment index.
A contiguous run of samples evaluated in one pass.