GENEIAL  0.2=/
 All Classes Pages
Interpolators.hpp
1 #pragma once
2 
3 #include <geneial/namespaces.h>
4 
5 #include <cmath>
6 #include <cassert>
7 
8 #ifndef M_PI
9 //TODO (bewo) move to const double..
10 #define M_PI 3.14159265358979323846f
11 #endif
12 
13 geneial_private_namespace(geneial)
14 {
15 geneial_private_namespace(utility)
16 {
17 
18 geneial_export_namespace
19 {
20 
21 template<typename VALUE_TYPE>
22 VALUE_TYPE Interpolators::linearInterpolate(VALUE_TYPE y0, VALUE_TYPE x0, VALUE_TYPE y1, VALUE_TYPE x1, VALUE_TYPE x)
23 {
24  if ((x0 - x1) <= 1e-7)
25  {
26  assert(std::abs(y1 - y0) <= 1e-7);
27  return y1;
28  }
29 
30  if (x1 >= x0)
31  {
32  return linearInterpolate<VALUE_TYPE>(y0, y1, (x - x0) / (x1 - x0));
33  }
34  else
35  {
36 
37  return linearInterpolate<VALUE_TYPE>(y1, y0, (x - x1) / (x0 - x1));
38  }
39 }
40 
41 template<typename VALUE_TYPE>
42 VALUE_TYPE Interpolators::linearInterpolate(VALUE_TYPE y0, VALUE_TYPE y1, VALUE_TYPE t)
43 {
44  return (1 - t) * y0 + t * y1;
45 }
46 
47 template<typename VALUE_TYPE>
48 VALUE_TYPE Interpolators::cosineInterpolate(VALUE_TYPE y0, VALUE_TYPE x0, VALUE_TYPE y1, VALUE_TYPE x1, VALUE_TYPE x)
49 {
50  if ((x0 - x1) <= 1e-7)
51  {
52  assert(std::abs(y1 - y0) <= 1e-7);
53  return y1;
54  }
55 
56  if (x1 >= x0)
57  {
58  return linearInterpolate<VALUE_TYPE>(y0, y1, (x - x0) / (x1 - x0));
59  }
60  else
61  {
62 
63  return linearInterpolate<VALUE_TYPE>(y1, y0, (x - x1) / (x0 - x1));
64  }
65 }
66 
67 template<typename VALUE_TYPE>
68 VALUE_TYPE Interpolators::cosineInterpolate(VALUE_TYPE y0, VALUE_TYPE y1, VALUE_TYPE t)
69 {
70  const double t2 = (1 - std::cos(t * M_PI)) / 2;
71  return (y0 * (1 - t2) + y1 * t2);
72 }
73 
74 } /* geneial_export_namespace */
75 } /* private namespace utility */
76 } /* private namespace geneial */
77