7#include "../numeric/module.hpp"
8#include "../SIMD/module.hpp"
9#include "../geometry/module.hpp"
10#include "../macros.hpp"
14hi_export_module(hikogui.graphic_path.bezier);
31 return {P1 - C * 2 + P2, (C - P1) * 2, P1};
36 constexpr std::array<T, 4> bezierToPolynomial(T P1, T C1, T C2, T P2)
noexcept
38 return {-P1 + C1 * 3 - C2 * 3 + P2, P1 * 3 - C1 * 6 + C2 * 3, P1 * -3 + C1 * 3, P1};
41 constexpr point2 bezierPointAt(point2 P1, point2 P2,
float t)
noexcept
43 hilet[a, b] = bezierToPolynomial(
static_cast<f32x4>(P1),
static_cast<f32x4>(P2));
44 return point2{a * t + b};
47 constexpr point2 bezierPointAt(point2 P1, point2 C, point2 P2,
float t)
noexcept
49 hilet[a, b, c] = bezierToPolynomial(
static_cast<f32x4>(P1),
static_cast<f32x4>(C),
static_cast<f32x4>(P2));
50 return point2{a * t * t + b * t + c};
53 constexpr point2 bezierPointAt(point2 P1, point2 C1, point2 C2, point2 P2,
float t)
noexcept
56 bezierToPolynomial(
static_cast<f32x4>(P1),
static_cast<f32x4>(C1),
static_cast<f32x4>(C2),
static_cast<f32x4>(P2));
57 return point2{a * t * t * t + b * t * t + c * t + d};
60 constexpr vector2 bezierTangentAt(point2 P1, point2 P2,
float t)
noexcept
65 constexpr vector2 bezierTangentAt(point2 P1, point2 C, point2 P2,
float t)
noexcept
68 hilet
C_ =
static_cast<f32x4>(C);
71 return vector2{2 * t * (
P2_ - 2 *
C_ +
P1_) + 2 * (
C_ -
P1_)};
74 constexpr vector2 bezierTangentAt(point2 P1, point2 C1, point2 C2, point2 P2,
float t)
noexcept
86 hilet[a, b] = bezierToPolynomial(P1, P2);
90 constexpr results<float, 2> bezierFindT(
float P1,
float C,
float P2,
float x)
noexcept
92 hilet[a, b, c] = bezierToPolynomial(P1, C, P2);
96 hi_force_inline
constexpr results<float, 3> bezierFindT(
float P1,
float C1,
float C2,
float P2,
float x)
noexcept
98 hilet[a, b, c, d] = bezierToPolynomial(P1, C1, C2, P2);
108 hilet
t_above = dot(P - P1, P2 - P1);
109 hilet
t_below = dot(P2 - P1, P2 - P1);
126 hilet
C_ =
static_cast<f32x4>(C);
132 hilet a = dot(p2, p2);
133 hilet b = 3 * dot(p1, p2);
134 hilet c = dot(2 * p1, p1) - dot(p2, p);
135 hilet d = -dot(p1, p);
136 return solvePolynomial(a, b, c, d);
153 for (hilet t : bezierFindT(P1.y(), P2.y(), y)) {
154 if (t >= 0.0f && t < 1.0f) {
155 r.add(bezierPointAt(P1, P2, t).x());
173 if (y <
std::min({P1.y(), C.y(), P2.y()}) || y >
std::max({P1.y(), C.y(), P2.y()})) {
177 for (hilet t : bezierFindT(P1.y(), C.y(), P2.y(), y)) {
178 if (t >= 0.0f && t <= 1.0f) {
179 r.add(bezierPointAt(P1, C, P2, t).x());
197 if (y <
std::min({P1.y(), C1.y(), C2.y(), P2.y()}) || y >
std::max({P1.y(), C1.y(), C2.y(), P2.y()})) {
201 for (hilet t : bezierFindT(P1.y(), C1.y(), C2.y(), P2.y(), y)) {
202 if (t >= 0.0f && t <= 1.0f) {
203 r.add(bezierPointAt(P1, C1, C2, P2, t).x());
224 hilet
P1P2 = hypot(P2 - P1);
229 hilet
P1C1 = hypot(C - P1);
230 hilet
C1P2 = hypot(P2 - C);
240 hilet
P1P2 = hypot(P2 - P1);
245 hilet
P1C1 = hypot(C1 - P1);
246 hilet
C1C2 = hypot(C2 - C1);
247 hilet
C2P2 = hypot(P2 - C2);
255 return {P1 + n * distance, P2 + n * distance};
281 return bezierPointAt(
A1,
A2, t);
310 return bezierPointAt(
A1,
A2, t);
DOXYGEN BUG.
Definition algorithm.hpp:16
hi_force_inline constexpr results< T, 1 > solvePolynomial(T const &a, T const &b) noexcept
Definition polynomial.hpp:144
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
constexpr results< float, 1 > bezierFindX(point2 P1, point2 P2, float y) noexcept
Definition bezier.hpp:146
hi_force_inline constexpr results< float, 1 > bezierFindTForNormalsIntersectingPoint(point2 P1, point2 P2, point2 P) noexcept
Find t on the line P1->P2 which is closest to P.
Definition bezier.hpp:106
std::optional< point2 > getIntersectionPoint(point2 A1, point2 A2, point2 B1, point2 B2) noexcept
Definition bezier.hpp:260
std::optional< point2 > getExtrapolatedIntersectionPoint(point2 A1, point2 A2, point2 B1, point2 B2) noexcept
Definition bezier.hpp:291
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
float bezierFlatness(point2 P1, point2 P2) noexcept
Definition bezier.hpp:213
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector2.hpp:19