GCC Code Coverage Report


Directory: ./
File: include/ndcurves/curve_conversion.h
Date: 2025-03-05 17:18:30
Exec Total Coverage
Lines: 50 50 100.0%
Branches: 61 116 52.6%

Line Branch Exec Source
1 #ifndef _CLASS_CURVE_CONVERSION
2 #define _CLASS_CURVE_CONVERSION
3
4 #include <iostream>
5 #include <stdexcept>
6 #include <vector>
7
8 #include "MathDefs.h"
9 #include "bernstein.h"
10 #include "curve_abc.h"
11 #include "curve_constraint.h"
12
13 namespace ndcurves {
14 /// \brief Converts a cubic hermite spline or a bezier curve to a polynomial.
15 /// \param curve : the bezier curve/cubic hermite spline defined between
16 /// [Tmin,Tmax] to convert. \return the equivalent polynomial.
17 template <typename Polynomial>
18 40 Polynomial polynomial_from_curve(
19 const typename Polynomial::curve_abc_t& curve) {
20 typedef typename Polynomial::t_point_t t_point_t;
21 typedef typename Polynomial::num_t num_t;
22
1/2
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
40 t_point_t coefficients;
23
3/6
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
40 coefficients.push_back(curve(curve.min()));
24 40 num_t fact = 1;
25
3/4
✓ Branch 1 taken 79 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 59 times.
✓ Branch 4 taken 20 times.
158 for (std::size_t i = 1; i <= curve.degree(); ++i) {
26 118 fact *= (num_t)i;
27
5/10
✓ Branch 1 taken 59 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 59 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 59 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 59 times.
✗ Branch 11 not taken.
✓ Branch 13 taken 59 times.
✗ Branch 14 not taken.
118 coefficients.push_back(curve.derivate(curve.min(), i) / fact);
28 }
29
30
3/6
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 20 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 20 times.
✗ Branch 8 not taken.
80 return Polynomial(coefficients, curve.min(), curve.max());
31 40 }
32
33 /// \brief Converts a cubic hermite spline or polynomial of order 3 or less to a
34 /// cubic bezier curve. \param curve : the polynomial of order 3 or less/cubic
35 /// hermite spline defined between [Tmin,Tmax] to convert. \return the
36 /// equivalent cubic bezier curve.
37 template <typename Bezier>
38 25 Bezier bezier_from_curve(const typename Bezier::curve_abc_t& curve) {
39
3/4
✓ Branch 1 taken 20 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 19 times.
25 if (curve.degree() > 3)
40
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 throw std::invalid_argument(
41 "bezier_from_curve is only implemented for curves of degree <= 3.");
42 typedef typename Bezier::point_t point_t;
43 typedef typename Bezier::t_point_t t_point_t;
44 typedef typename Bezier::num_t num_t;
45
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 num_t T_min = curve.min();
46
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 num_t T_max = curve.max();
47 24 num_t T = T_max - T_min;
48 // Positions and derivatives
49
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 point_t p0 = curve(T_min);
50
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 point_t p1 = curve(T_max);
51
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 point_t m0 = curve.derivate(T_min, 1);
52
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 point_t m1 = curve.derivate(T_max, 1);
53 // Convert to bezier control points
54 // for t in [Tmin,Tmax] and T=Tmax-Tmin : x'(0)=3(b_p1-b_p0)/T and
55 // x'(1)=3(b_p3-b_p2)/T so : m0=3(b_p1-b_p0)/T and m1=3(b_p3-b_p2)/T
56 // <=> b_p1=T(m0/3)+b_p0 and b_p2=-T(m1/3)+b_p3
57
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 point_t b_p0 = p0;
58
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 point_t b_p3 = p1;
59
4/8
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 19 times.
✗ Branch 11 not taken.
24 point_t b_p1 = T * m0 / 3 + b_p0;
60
4/8
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 19 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 19 times.
✗ Branch 11 not taken.
24 point_t b_p2 = -T * m1 / 3 + b_p3;
61
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 t_point_t control_points;
62
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 control_points.push_back(b_p0);
63
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 control_points.push_back(b_p1);
64
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 control_points.push_back(b_p2);
65
1/2
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
24 control_points.push_back(b_p3);
66 24 return Bezier(control_points.begin(), control_points.end(), curve.min(),
67
3/6
✓ Branch 1 taken 19 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 19 times.
✗ Branch 5 not taken.
✓ Branch 9 taken 19 times.
✗ Branch 10 not taken.
48 curve.max());
68 24 }
69
70 /// \brief Converts a polynomial of order 3 or less/cubic bezier curve to a
71 /// cubic hermite spline. \param curve : the polynomial of order 3 or
72 /// less/cubic bezier curve defined between [Tmin,Tmax] to convert. \return the
73 /// equivalent cubic hermite spline.
74 template <typename Hermite>
75 17 Hermite hermite_from_curve(const typename Hermite::curve_abc_t& curve) {
76
3/4
✓ Branch 1 taken 17 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 16 times.
17 if (curve.degree() > 3)
77
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 throw std::invalid_argument(
78 "hermite_from_curve is only implemented for curves of degree <= 3.");
79 typedef typename Hermite::pair_point_tangent_t pair_point_tangent_t;
80 typedef typename Hermite::t_pair_point_tangent_t t_pair_point_tangent_t;
81 typedef typename Hermite::point_t point_t;
82 typedef typename Hermite::num_t num_t;
83
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 num_t T_min = curve.min();
84
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 num_t T_max = curve.max();
85 // Positions and derivatives
86
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 point_t p0 = curve(T_min);
87
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 point_t p1 = curve(T_max);
88
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 point_t m0 = curve.derivate(T_min, 1);
89
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 point_t m1 = curve.derivate(T_max, 1);
90 // Create pairs pos/vel
91
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 pair_point_tangent_t pair0(p0, m0);
92
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 pair_point_tangent_t pair1(p1, m1);
93
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 t_pair_point_tangent_t control_points;
94
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 control_points.push_back(pair0);
95
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 control_points.push_back(pair1);
96 16 std::vector<double> time_control_points;
97
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 time_control_points.push_back(T_min);
98
1/2
✓ Branch 1 taken 16 times.
✗ Branch 2 not taken.
16 time_control_points.push_back(T_max);
99 return Hermite(control_points.begin(), control_points.end(),
100
1/2
✓ Branch 3 taken 16 times.
✗ Branch 4 not taken.
32 time_control_points);
101 16 }
102 } // namespace ndcurves
103 #endif //_CLASS_CURVE_CONVERSION
104