115{
116 if (start_idx + 3 >= curve_verts.size()) {
117 return;
118 }
119
120 Eigen::MatrixXd segment_controls(3, 4);
121 for (Eigen::Index i = 0; i < 4; ++i) {
122 const auto& pt = curve_verts[start_idx + i].position;
123 segment_controls.col(i) << pt.x, pt.y, pt.z;
124 }
125
127 segment_controls,
131
134 interpolated,
136 }
137
138 for (Eigen::Index i = 0; i < interpolated.cols() - 1; ++i) {
139 float t0 = static_cast<float>(i) / static_cast<float>(interpolated.cols() - 1);
140 float t1 = static_cast<float>(i + 1) / static_cast<float>(interpolated.cols() - 1);
141
142 size_t ctrl_idx0 = start_idx + std::min(static_cast<size_t>(t0 * 3), size_t(3));
143 size_t ctrl_idx1 = start_idx + std::min(static_cast<size_t>(t1 * 3), size_t(3));
144
147
150
151 glm::vec3 p0(interpolated(0, i), interpolated(1, i), interpolated(2, i));
152 glm::vec3 p1(interpolated(0, i + 1), interpolated(1, i + 1), interpolated(2, i + 1));
153
154 output.push_back({ p0, color0, thick0 });
155 output.push_back({ p1, color1, thick1 });
156 }
157}
Kinesis::InterpolationMode m_mode
bool m_force_uniform_thickness
Eigen::Index m_samples_per_segment
bool m_arc_length_parameterization
glm::vec3 m_current_color
float m_current_thickness
bool m_force_uniform_color
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.