cgv
Loading...
Searching...
No Matches
interpolator.h
1#pragma once
2
3#include <algorithm>
4#include <vector>
5
6#include "functions.h"
7
8namespace cgv {
9namespace math {
10
11template<typename T>
13public:
14 typedef std::pair<float, T> control_point_type;
15 using const_iterator = typename std::vector<control_point_type>::const_iterator;
16
17private:
18 std::vector<control_point_type> control_points;
19
20 void sort_control_points() {
21 std::sort(control_points.begin(), control_points.end(), [](const control_point_type& a, const control_point_type& b) { return a.first < b.first; });
22 }
23
24public:
27
28 void clear() {
29 control_points.clear();
30 }
31
32 bool empty() const { return control_points.empty(); }
33
34 size_t size() const {
35 return control_points.size();
36 }
37
38 void push_back(float t, const T& v) {
39 control_points.push_back(std::make_pair(t, v));
40 sort_control_points();
41 }
42
43 void assign(const std::vector<control_point_type>& control_points) {
44 this->control_points = control_points;
45 sort_control_points();
46 }
47
48 control_point_type operator [](size_t i) const {
49 return control_points[i];
50 }
51
52 control_point_type& operator [](size_t i) {
53 return control_points[i];
54 }
55
56 const std::vector<control_point_type>& ref_points() const {
57 return control_points;
58 }
59
60 const_iterator begin() const { return control_points.cbegin(); }
61 const_iterator end() const { return control_points.cend(); }
62
63 control_point_type min() const {
64 if(size() > 0)
65 return control_points.front();
66 return std::make_pair(0.0f, (T)0);
67 }
68
69 control_point_type max() const {
70 if(size() > 0)
71 return control_points.back();
72 return std::make_pair(0.0f, (T)0);
73 }
74};
75
76template<typename T>
78public:
79 virtual T interpolate(control_point_container<T> control_points, float t) const = 0;
80
81 virtual std::vector<T> interpolate(control_point_container<T> control_points, size_t n) const = 0;
82};
83
84}
85}
the cgv namespace
Definition print.h:11