1 #ifndef INCLUDE_ONCE_F820C110_1DC9_40B4_8442_EDD0227CB7E8 2 #define INCLUDE_ONCE_F820C110_1DC9_40B4_8442_EDD0227CB7E8 8 template<
typename Number,
typename Vec2>
16 Chunk(Number xMax, Number a, Number b, Number c)
23 Number sample(Number
const x)
const 25 assert(!chunks.empty());
27 std::size_t chunkIndex;
28 for(chunkIndex=0; chunkIndex<chunks.size() && x > chunks[chunkIndex].xMax; ++chunkIndex);
30 if(chunkIndex==chunks.size())
31 throw std::out_of_range(
"Too large x");
33 const auto a = chunks[chunkIndex].a;
34 const auto b = chunks[chunkIndex].b;
35 const auto c = chunks[chunkIndex].c;
36 return a*x*x + b*x + c;
39 std::vector<Chunk> chunks;
42 template<
typename Vec2,
typename Number=
typename std::remove_cv<
typename std::remove_reference<decltype(Vec2().x)>::type>::type>
45 assert(pointCount>=3);
46 assert(std::is_sorted(points,points+pointCount,[](Vec2
const& a, Vec2
const& b){
return a.x<b.x;}));
48 const auto sqr=[](Number x){
return x*x; };
49 enum { A=0, B=1, C=2 };
51 const int n=pointCount;
54 using namespace Eigen;
55 using Matrix=Eigen::Matrix<Number, Dynamic, Dynamic>;
56 using Vector=Eigen::Matrix<Number, Dynamic, 1>;
57 Matrix M=Matrix::Zero(N, N);
58 Vector R=Vector::Zero(N);
65 M(0, 3*0+A)=sqr(points[0].x);
66 M(0, 3*0+B)= points[0].x ;
71 M(1, 3*(n-2-1)+A)=sqr(points[n-1].x);
72 M(1, 3*(n-2-1)+B)= points[n-1].x ;
79 for(
int i=0; i<n-2; ++i)
81 M(2+i, 3*i+A)=sqr(points[i+1].x);
82 M(2+i, 3*i+B)= points[i+1].x ;
92 for(
int i=0; i<n-3; ++i)
94 M(n+i, 3*i+A) = sqr(0.5*(points[i+1].x+points[i+2].x));
95 M(n+i, 3*i+B) = 0.5*(points[i+1].x+points[i+2].x) ;
97 M(n+i, 3*(i+1)+A) = -sqr(0.5*(points[i+1].x+points[i+2].x));
98 M(n+i, 3*(i+1)+B) = - 0.5*(points[i+1].x+points[i+2].x) ;
99 M(n+i, 3*(i+1)+C) = -1;
105 for(
int i=0; i<n-3; ++i)
107 M(2*n-3+i, 3*i+A) = points[i+1].x+points[i+2].x;
108 M(2*n-3+i, 3*i+B) = 1;
109 M(2*n-3+i, 3*(i+1)+A) = -(points[i+1].x+points[i+2].x);
110 M(2*n-3+i, 3*(i+1)+B) = -1;
113 const Vector ABCs = M.colPivHouseholderQr().solve(R);
115 std::vector<typename SplineOrder2InterpolationFunction<Number,Vec2>::Chunk> coefs;
118 coefs.emplace_back((points[1].x+points[2].x)/2,
119 ABCs(A), ABCs(B), ABCs(C));
122 for(
int i=1; i<n-3; ++i)
123 coefs.emplace_back((points[i+1].x+points[i+2].x)/2,
124 ABCs(3*i+A), ABCs(3*i+B), ABCs(3*i+C));
127 coefs.emplace_back(points[n-1].x,
128 ABCs(3*(n-3)+A), ABCs(3*(n-3)+B), ABCs(3*(n-3)+C));
Definition: spline-interpolation.hpp:12
Definition: spline-interpolation.hpp:9