cgv
Loading...
Searching...
No Matches
convert_curve.h
1#pragma once
2
3#include <array>
4
5#include "bezier.h"
6#include "hermite.h"
7
8namespace cgv {
9namespace math {
10
18template<typename T, typename S = T>
19static std::array<T, 5> split_hermite_to_quadratic_beziers(const hermite_node<T>& n0, const hermite_node<T>& n1) {
20 std::array<T, 5> bez;
21 bez[0] = n0.val;
22 bez[1] = n0.val + n0.tan * S(0.2667);
23 auto h = n1.val - n1.tan * S(0.2667);
24 bez[2] = (bez[1] + h) * S(0.5);
25 bez[3] = h;
26 bez[4] = n1.val;
27 return bez;
28}
29
37template<typename T, typename S = T>
38static std::array<T, 4> hermite_to_cubic_bezier(const hermite_node<T>& n0, const hermite_node<T>& n1) {
39 return {
40 n0.val,
41 n0.val + n0.tan / S(3),
42 n1.val - n1.tan / S(3),
43 n1.val
44 };
45}
46
56template<typename T, typename S = T>
57static std::pair<hermite_node<T>, hermite_node<T>> cubic_bezier_to_hermite(const T& p0, const T& p1, const T& p2, const T& p3) {
58 T t0 = S(3) * (p1 - p0);
59 T t1 = S(3) * (p3 - p2);
60 return { { p0, t0 }, { p3, t1 } };
61}
62
72template<typename T, typename S = T>
73static std::array<T, 4> cubic_basis_to_bezier(const T& b0, const T& b1, const T& b2, const T& b3) {
74 constexpr S one_over_three = S(1) / S(3);
75 constexpr S one_over_six = S(1) / S(6);
76 T p0 = one_over_six * (b0 + S(4) * b1 + b2);
77 T p1 = one_over_three * (S(2) * b1 + b2);
78 T p2 = one_over_three * (b1 + S(2) * b2);
79 T p3 = one_over_six * (b1 + S(4) * b2 + b3);
80 return { p0, p1, p2, p3 };
81}
82
83} // namespace math
84} // namespace cgv
the cgv namespace
Definition print.h:11