1#ifndef OE_UTIL_BEZIER_CURVE_H
2#define OE_UTIL_BEZIER_CURVE_H
8 enum class BezierCurveType
20 {0.5f * t} -> std::convertible_to<T>;
21 {t + t} -> std::convertible_to<T>;
34 template <BezierCurveType Type, CurveValueConcept T>
37 if constexpr (Type == BezierCurveType::Quadratic)
39 assert(P.size() == 3);
41 float b0 = (1 - t) * (1 - t);
42 float b1 = 2 * (1 - t) * t;
45 return P[0] * b0 + P[1] * b1 + P[2] * b2;
47 else if constexpr (Type == BezierCurveType::Cubic)
49 assert(P.size() == 4);
51 float b0 = (1 - t) * (1 - t) * (1 - t);
52 float b1 = 3 * t * (1 - t) * (1 - t);
53 float b2 = 3 * t * t * (1 - t);
56 return P[0] * b0 + P[1] * b1 + P[2] * b2 + P[3] * b3;
59 static_assert(
"Unknown curve type");
70 template <BezierCurveType Type, CurveValueConcept T>
73 if constexpr (Type == BezierCurveType::Quadratic)
75 assert(P.size() == 3);
77 float b0 = -2 * (1 - t);
78 float b1 = 2 * (1 - t) -2 * t;
81 return P[0] * b0 + P[1] * b1 + P[2] * b2;
83 else if constexpr (Type == BezierCurveType::Cubic)
85 assert(P.size() == 4);
87 float b0 = -3 * (1 - t) * (1 - t);
88 float b1 = 3 * (1 - t) * (1 - t) - 6 * t * (1 - t);
89 float b2 = 6 * t * (1 - t) - 3 * t * t;
92 return P[0] * b0 + P[1] * b1 + P[2] * b2 + P[3] * b3;
95 static_assert(
"Unknown curve type");
Curve point value type must overloads operators "addition between objects" and "multiplication with a...
Definition bezier_curve.h:18
Various utilities.
Definition node.h:15
Definition bezier_curve.h:25
static T evaluateDerivativeCurve(std::span< const T > P, const float t)
Evaluate a derivated Bezier curve.
Definition bezier_curve.h:71
static T evaluateCurve(std::span< const T > P, const float t)
Evaluate a point on a Bezier curve using De Casteljau's Algorithm.
Definition bezier_curve.h:35