Oxygen Engine
Modern C++ 3D Engine using OpenGL
Loading...
Searching...
No Matches
bezier_curve.h
1#ifndef OE_UTIL_BEZIER_CURVE_H
2#define OE_UTIL_BEZIER_CURVE_H
3
4#include <span>
5
6namespace oe::util
7{
8 enum class BezierCurveType
9 {
10 Quadratic = 3, //< Each curve is made using 3 control points
11 Cubic = 4, //< Each curve is made using 4 control points
12 };
13
17 template <typename T>
18 concept CurveValueConcept = requires(T t)
19 {
20 {0.5f * t} -> std::convertible_to<T>;
21 {t + t} -> std::convertible_to<T>;
22 };
23
24 struct Bezier
25 {
34 template <BezierCurveType Type, CurveValueConcept T>
35 inline static T evaluateCurve(std::span<const T> P, const float t)
36 {
37 if constexpr (Type == BezierCurveType::Quadratic)
38 {
39 assert(P.size() == 3);
40
41 float b0 = (1 - t) * (1 - t);
42 float b1 = 2 * (1 - t) * t;
43 float b2 = t * t;
44
45 return P[0] * b0 + P[1] * b1 + P[2] * b2;
46 }
47 else if constexpr (Type == BezierCurveType::Cubic)
48 {
49 assert(P.size() == 4);
50
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);
54 float b3 = t * t * t;
55
56 return P[0] * b0 + P[1] * b1 + P[2] * b2 + P[3] * b3;
57 }
58
59 static_assert("Unknown curve type");
60 }
61
70 template <BezierCurveType Type, CurveValueConcept T>
71 inline static T evaluateDerivativeCurve(std::span<const T> P, const float t)
72 {
73 if constexpr (Type == BezierCurveType::Quadratic)
74 {
75 assert(P.size() == 3);
76
77 float b0 = -2 * (1 - t);
78 float b1 = 2 * (1 - t) -2 * t;
79 float b2 = 2 * t;
80
81 return P[0] * b0 + P[1] * b1 + P[2] * b2;
82 }
83 else if constexpr (Type == BezierCurveType::Cubic)
84 {
85 assert(P.size() == 4);
86
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;
90 float b3 = 3 * t * t;
91
92 return P[0] * b0 + P[1] * b1 + P[2] * b2 + P[3] * b3;
93 }
94
95 static_assert("Unknown curve type");
96 }
97 };
98}
99
100
101#endif
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