1#ifndef TATOOINE_POLYNOMIAL_LINE_H
2#define TATOOINE_POLYNOMIAL_LINE_H
4#include <tatooine/available_libraries.h>
14template <
typename Real, std::
size_t N, std::
size_t Degree>
28 static constexpr auto degree() {
return Degree; }
47 template <
typename... Polynomials>
48 requires(is_polynomial<Polynomials> && ...)
63 template <std::size_t... Is>
64 constexpr auto evaluate(Real t, std::index_sequence<Is...> )
const {
70 return evaluate(t, std::make_index_sequence<N>{});
76 template <std::size_t... Is>
77 constexpr auto diff(std::index_sequence<Is...> )
const {
82 constexpr auto diff()
const {
return diff(std::make_index_sequence<N>{}); }
85 template <std::size_t... Is>
86 constexpr auto tangent(Real t, std::index_sequence<Is...> )
const {
92 return tangent(t, std::make_index_sequence<N>{});
96 template <std::size_t... Is>
98 std::index_sequence<Is...> )
const {
117 const auto ltang = length(tang);
118 if (std::abs(ltang) < 1e-10) {
121 if constexpr (N == 2) {
122 return std::abs(tang(0) * snd_der(1) - tang(1) * snd_der(0)) /
123 (ltang * ltang * ltang);
124 }
else if constexpr (N == 3) {
125 return length(
cross(tang, snd_der)) / (ltang * ltang * ltang);
129 template <
template <
typename>
typename InterpolationKernel,
134 auto& tang = discretized.tangents();
136 discretized.template vertex_property<vec<Real, N>>(
"second_derivative");
137 auto& curv = discretized.scalar_vertex_property(
"curvature");
138 for (
auto const t : ts) {
143 curv.back() =
curvature(tang.back(), snd_der.back());
150 for (std::size_t i = 0; i <
size(
range) - 1; ++i) {
157template <
typename... Polynomials>
160 sizeof...(Polynomials),
max(Polynomials::degree()...)>;
162template <
typename Real, std::
size_t N, std::
size_t Degree>
165 out <<
"[(" <<
line.polynomial(0) <<
")";
166 for (std::size_t i = 1; i < N; ++i) {
167 out <<
", (" <<
line.polynomial(i) <<
")";
Definition: polynomial_line.h:15
auto & polynomials()
Definition: polynomial_line.h:59
constexpr auto operator()(Real t) const
Definition: polynomial_line.h:73
constexpr polynomial_line & operator=(polynomial_line &&other)=default
constexpr auto curvature(Real t, const vec_type &tang) const
Definition: polynomial_line.h:111
constexpr auto arc_length(const linspace< Real > &range) const
Definition: polynomial_line.h:148
const auto & polynomials() const
Definition: polynomial_line.h:60
constexpr auto tangent(Real t, std::index_sequence< Is... >) const
Definition: polynomial_line.h:86
auto & polynomial(std::size_t i)
Definition: polynomial_line.h:56
static constexpr auto degree()
Definition: polynomial_line.h:28
constexpr auto second_derivative(Real t) const
Definition: polynomial_line.h:103
constexpr auto evaluate(linspace< Real_ > const &ts) const
Definition: polynomial_line.h:131
constexpr auto evaluate(Real t, std::index_sequence< Is... >) const
Definition: polynomial_line.h:64
constexpr auto evaluate(Real t) const
Definition: polynomial_line.h:69
constexpr polynomial_line(polynomial_line &&other)=default
constexpr auto tangent(Real t) const
Definition: polynomial_line.h:91
constexpr polynomial_line(const polynomial_line &other)=default
std::array< polynomial_type, N > m_polynomials
Definition: polynomial_line.h:34
constexpr auto curvature(Real t) const
Definition: polynomial_line.h:107
static constexpr auto num_dimensions() -> std::size_t
Definition: polynomial_line.h:27
constexpr polynomial_line()
Definition: polynomial_line.h:40
const auto & polynomial(std::size_t i) const
Definition: polynomial_line.h:57
constexpr auto curvature(const vec_type &tang, const vec_type &snd_der) const -> Real
Definition: polynomial_line.h:115
constexpr auto second_derivative(Real t, std::index_sequence< Is... >) const
Definition: polynomial_line.h:97
constexpr auto diff(std::index_sequence< Is... >) const
Definition: polynomial_line.h:77
constexpr polynomial_line & operator=(const polynomial_line &other)=default
constexpr auto diff() const
Definition: polynomial_line.h:82
Definition: concepts.h:30
Definition: concepts.h:84
Definition: algorithm.h:6
auto operator<<(std::ostream &out, linspace< Real > const &l) -> auto &
Definition: linspace.h:165
constexpr auto distance(Iter const &it0, Iter const &it1)
Definition: iterator_facade.h:372
typename common_type_impl< Ts... >::type common_type
Definition: common_type.h:23
constexpr auto make_array()
Definition: make_array.h:22
constexpr auto max(A &&a, B &&b)
Definition: math.h:20
auto size(vec< ValueType, N > const &v)
Definition: vec.h:148
constexpr auto cross(base_tensor< Tensor0, T0, 3 > const &lhs, base_tensor< Tensor1, T1, 3 > const &rhs)
Definition: cross.h:9
auto parameterization() -> auto &
Definition: line.h:502
Definition: linspace.h:26
Definition: polynomial.h:14