MayaFlux 1.0.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 881 of file MotionCurves.cpp.

887{
888 const auto n = static_cast<size_t>(point_count);
889 const auto samples = static_cast<size_t>(num_samples);
890
891 if (point_count < 2 || num_samples < 2) {
892 out.assign(points.begin(), points.end());
893 return;
894 }
895
896 const double* src = points.data();
897
898 m_arc.assign(n, 0.0);
899
900 for (size_t d = 0; d < dim; ++d) {
901 const double* row = src + d * n;
902 for (size_t i = 1; i < n; ++i) {
903 const double delta = row[i] - row[i - 1];
904 m_arc[i] += delta * delta;
905 }
906 }
907
908 for (size_t i = 1; i < n; ++i) {
909 m_arc[i] = std::sqrt(m_arc[i]);
910 }
911
912 std::inclusive_scan(m_arc.data() + 1, m_arc.data() + n, m_arc.data() + 1);
913
914 const double total_length = m_arc[n - 1];
915 if (total_length == 0.0) {
916 out.assign(points.begin(), points.end());
917 return;
918 }
919
920 m_lower.resize(samples);
921 m_frac.resize(samples);
922
923 const double step = total_length / static_cast<double>(num_samples - 1);
924 size_t upper = 1;
925
926 for (size_t i = 0; i < samples; ++i) {
927 const double target = static_cast<double>(i) * step;
928
929 while (upper < n - 1 && m_arc[upper] < target) {
930 ++upper;
931 }
932
933 const size_t lower = upper - 1;
934 const double span = m_arc[upper] - m_arc[lower];
935
936 m_lower[i] = lower;
937 m_frac[i] = (span > 0.0) ? ((target - m_arc[lower]) / span) : 0.0;
938 }
939
940 out.resize(dim * samples);
941
942 for (size_t d = 0; d < dim; ++d) {
943 const double* row = src + d * n;
944 double* dst = out.data() + d * samples;
945
946 for (size_t i = 0; i < samples; ++i) {
947 const size_t lower = m_lower[i];
948 const double t = m_frac[i];
949 dst[i] = (1.0 - t) * row[lower] + t * row[lower + 1];
950 }
951 }
952}
std::vector< glm::vec2 > * points
uint32_t * dst
const uint32_t * src
std::vector< float > * out

References dst, out, points, and src.

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: