MeshLib
 
Loading...
Searching...
No Matches
MRBestFitPolynomial.h
Go to the documentation of this file.
1#pragma once
2
3#include "MRMeshFwd.h"
4#include <MRPch/MREigenCore.h>
5
6#include <cstddef>
7#include <vector>
8#include <variant>
9#include <optional>
10
11
12namespace MR
13{
14
15
16constexpr bool canSolvePolynomial( auto degree )
17{
18 return 1 <= degree && degree <= 4;
19}
20
21constexpr bool canMinimizePolynomial( auto degree )
22{
23 return degree <= 5;
24}
25
26// Please note that these template classes are explicitly instantiated in the corresponding .cpp files.
27// The following degrees are instantiated: [2; 6].
28
29template <typename T, size_t degree>
31{
32 static constexpr size_t n = degree + 1;
33 Eigen::Vector<T, n> a;
34
35 template <typename NewT>
37 { return { a.template cast<NewT>() }; }
38
39 MRMESH_API T operator() ( T x ) const;
40
41 MRMESH_API std::vector<T> solve( T tol ) const
42 requires ( canSolvePolynomial( degree ) );
43
44 MRMESH_API Polynomial<T, degree == 0 ? 0 : degree - 1> deriv() const;
45
46 MRMESH_API T intervalMin( T a, T b ) const
47 requires ( canMinimizePolynomial( degree ) );
48};
49
50template <size_t degree>
52
53template <size_t degree>
55
56
57template <typename T>
58using Polynomialx = std::variant
66 >;
67
69template <typename T>
71{
73
74 template <size_t degree>
76 poly( p )
77 {}
78
79 MRMESH_API T operator() ( T x ) const;
80
82
83 MRMESH_API std::optional<T> intervalMin( T a, T b ) const;
84};
85
88
89
90template <typename T, size_t degree>
92{
93public:
95 MRMESH_API explicit BestFitPolynomial( T reg );
96
97 MRMESH_API void addPoint( T x, T y );
98
99 MRMESH_API void addPoint( T x, T y, T weight );
100
103
104private:
105 static constexpr size_t n = degree + 1;
106 T lambda_ {};
107 Eigen::Matrix<T, n, n> XtX_;
108 Eigen::Vector<T, n> XtY_;
109 T sumWeight_ = 0;
110};
111
112template <size_t degree>
114
115template <size_t degree>
117
118
119
120}
#define MRMESH_API
Definition MRMesh/MRMeshFwd.h:46
Definition MRBestFitPolynomial.h:92
MRMESH_API void addPoint(T x, T y)
MRMESH_API BestFitPolynomial(T reg)
MRMESH_API void addPoint(T x, T y, T weight)
MRMESH_API Polynomial< T, degree > getBestPolynomial() const
Definition MRCameraOrientationPlugin.h:7
constexpr bool canMinimizePolynomial(auto degree)
Definition MRBestFitPolynomial.h:21
constexpr bool canSolvePolynomial(auto degree)
Definition MRBestFitPolynomial.h:16
std::variant< Polynomial< T, 0 >, Polynomial< T, 1 >, Polynomial< T, 2 >, Polynomial< T, 3 >, Polynomial< T, 4 >, Polynomial< T, 5 >, Polynomial< T, 6 > > Polynomialx
Definition MRBestFitPolynomial.h:58
This is a unifying interface for a polynomial of some degree, known only in runtime.
Definition MRBestFitPolynomial.h:71
PolynomialWrapper(const Polynomial< T, degree > &p)
Definition MRBestFitPolynomial.h:75
MRMESH_API PolynomialWrapper< T > deriv() const
Polynomialx< T > poly
Definition MRBestFitPolynomial.h:72
MRMESH_API std::optional< T > intervalMin(T a, T b) const
MRMESH_API T operator()(T x) const
Definition MRBestFitPolynomial.h:31
static constexpr size_t n
Definition MRBestFitPolynomial.h:32
MRMESH_API T intervalMin(T a, T b) const
MRMESH_API T operator()(T x) const
Polynomial< NewT, degree > cast() const
Definition MRBestFitPolynomial.h:36
MRMESH_API Polynomial< T, degree==0 ? 0 :degree - 1 > deriv() const
Eigen::Vector< T, n > a
Definition MRBestFitPolynomial.h:33
MRMESH_API std::vector< T > solve(T tol) const