296{
297 Eigen::MatrixXd control_points(3, num_points);
298 for (Eigen::Index i = 0; i < num_points; ++i) {
299 control_points.col(i) << points[i].position.x,
300 points[i].position.y,
301 points[i].position.z;
302 }
303
304 size_t num_segments = num_points - 1;
305 Eigen::Index total_samples = 1 + (Eigen::Index)num_segments * ((Eigen::Index)
m_samples_per_segment - 1);
306
308 control_points,
309 total_samples,
311 0.5);
312
315 dense_points, total_samples);
316 }
317
319 m_vertices.reserve((dense_points.cols() - 1) * 2);
320
321 for (Eigen::Index i = 0; i < dense_points.cols() - 1; ++i) {
322 float t0 = float(i) / float(total_samples - 1);
323 float t1 = float(i + 1) / float(total_samples - 1);
324
325 auto segment_idx0 = std::min<size_t>(size_t(t0 * float(num_segments)), num_segments - 1);
326 auto segment_idx1 = std::min<size_t>(size_t(t1 * float(num_segments)), num_segments - 1);
327
330
333
335 .position = glm::vec3(dense_points(0, i), dense_points(1, i), dense_points(2, i)),
336 .color = color0,
337 .thickness = thick0 });
338
340 .position = glm::vec3(dense_points(0, i + 1), dense_points(1, i + 1), dense_points(2, i + 1)),
341 .color = color1,
342 .thickness = thick1 });
343 }
344}
std::vector< LineVertex > m_vertices
bool m_force_uniform_color
If true, all vertices use m_line_color instead of per-vertex color.
size_t m_samples_per_segment
Controls smoothness vs performance.
bool m_force_uniform_thickness
If true, all vertices use m_line_thickness instead of per-vertex thickness.
bool m_use_arc_length_reparameterization
Optional constant-speed.
Kinesis::InterpolationMode m_path_interpolation_mode
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.