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

◆ reparameterize_planar()

void MayaFlux::Kinesis::CurveEvaluator::reparameterize_planar ( std::span< const double >  points,
size_t  dim,
Eigen::Index  point_count,
Eigen::Index  num_samples,
std::vector< double > &  out 
)

Resample a polyline to uniform arc length, coordinate-major.

Parameters
pointsCoordinate-major, dim * point_count doubles.
dimCoordinate count per point, at least 1.
point_countInput sample count.
num_samplesOutput sample count, at least 2.
outResized to dim * num_samples, coordinate-major.

points and out must not alias. A zero-length span between two consecutive points yields that span's start point rather than a division by zero.

Definition at line 741 of file MotionCurves.cpp.

747{
748 const auto n = static_cast<size_t>(point_count);
749 const auto samples = static_cast<size_t>(num_samples);
750
751 if (point_count < 2 || num_samples < 2) {
752 out.assign(points.begin(), points.end());
753 return;
754 }
755
756 const double* src = points.data();
757
758 m_arc.assign(n, 0.0);
759
760 for (size_t d = 0; d < dim; ++d) {
761 const double* row = src + d * n;
762 for (size_t i = 1; i < n; ++i) {
763 const double delta = row[i] - row[i - 1];
764 m_arc[i] += delta * delta;
765 }
766 }
767
768 for (size_t i = 1; i < n; ++i) {
769 m_arc[i] = std::sqrt(m_arc[i]);
770 }
771
772 std::inclusive_scan(m_arc.data() + 1, m_arc.data() + n, m_arc.data() + 1);
773
774 const double total_length = m_arc[n - 1];
775 if (total_length == 0.0) {
776 out.assign(points.begin(), points.end());
777 return;
778 }
779
780 m_lower.resize(samples);
781 m_frac.resize(samples);
782
783 const double step = total_length / static_cast<double>(num_samples - 1);
784 size_t upper = 1;
785
786 for (size_t i = 0; i < samples; ++i) {
787 const double target = static_cast<double>(i) * step;
788
789 while (upper < n - 1 && m_arc[upper] < target) {
790 ++upper;
791 }
792
793 const size_t lower = upper - 1;
794 const double span = m_arc[upper] - m_arc[lower];
795
796 m_lower[i] = lower;
797 m_frac[i] = (span > 0.0) ? ((target - m_arc[lower]) / span) : 0.0;
798 }
799
800 out.resize(dim * samples);
801
802 for (size_t d = 0; d < dim; ++d) {
803 const double* row = src + d * n;
804 double* dst = out.data() + d * samples;
805
806 for (size_t i = 0; i < samples; ++i) {
807 const size_t lower = m_lower[i];
808 const double t = m_frac[i];
809 dst[i] = (1.0 - t) * row[lower] + t * row[lower + 1];
810 }
811 }
812}
std::vector< glm::vec2 > * points

References points.

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

+ Here is the caller graph for this function: