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

◆ compute_path_curvature()

std::vector< Nodes::LineVertex > MayaFlux::Kinesis::compute_path_curvature ( const std::vector< Nodes::LineVertex > &  path_vertices,
float  curvature_scale,
size_t  stride = 1 
)

Compute curvature vectors along a path (2nd derivative approximation)

Parameters
path_verticesSequential vertices defining curve
curvature_scaleMagnitude scaling factor
strideSample every stride-th vertex
Returns
Line segments representing discrete curvature

Curvature at i approximated by: (v[i+1] - 2*v[i] + v[i-1])

Definition at line 322 of file GeometryPrimitives.cpp.

326{
327 if (path_vertices.size() < 3 || stride == 0) {
328 return {};
329 }
330
331 std::vector<Nodes::LineVertex> curvatures;
332 curvatures.reserve((path_vertices.size() - 2) / stride * 2);
333
334 for (size_t i = 1; i < path_vertices.size() - 1; i += stride) {
335 glm::vec3 p_prev = path_vertices[i - 1].position;
336 glm::vec3 p_curr = path_vertices[i].position;
337 glm::vec3 p_next = path_vertices[i + 1].position;
338
339 glm::vec3 curvature = (p_next - 2.0F * p_curr + p_prev) * curvature_scale;
340
341 glm::vec3 color = path_vertices[i].color;
342 float thickness = path_vertices[i].thickness;
343
344 curvatures.push_back({ .position = p_curr,
345 .color = color,
346 .thickness = thickness });
347
348 curvatures.push_back({ .position = p_curr + curvature,
349 .color = color,
350 .thickness = thickness });
351 }
352
353 return curvatures;
354}