Wayverb
cosine_interp.h
1 #pragma once
2 
3 #include "utilities/mapping_iterator_adapter.h"
4 
5 #include <algorithm>
6 #include <cmath>
7 #include <stdexcept>
8 
9 namespace wayverb {
10 namespace core {
11 
17 template <typename U>
18 auto linear_interp(double x, U a, U b) {
19  return a + x * (b - a);
20 }
21 
22 struct linear_interp_functor final {
23  template <typename U>
24  auto operator()(double x, U a, U b) const {
25  return linear_interp(x, a, b);
26  }
27 };
28 
32 template <typename U>
33 auto cosine_interp(double x, U a, U b) {
34  return linear_interp(std::cos(M_PI * x) * 0.5 + 0.5, b, a);
35 }
36 
37 struct cosine_interp_functor final {
38  template <typename U>
39  auto operator()(double x, U a, U b) const {
40  return cosine_interp(x, a, b);
41  }
42 };
43 
44 template <typename T, typename U, typename Func>
45 auto interp(double a, T x1, T x2, U y1, U y2, Func&& func) {
46  return func((a - x1) / (x2 - x1), y1, y2);
47 }
48 
51 template <typename It, typename Func>
52 auto interp(It b, It e, double a, Func&& func) {
53  if (b == e) {
54  throw std::runtime_error{"Can't interpolate empty range."};
55  }
56 
57  const auto it =
58  std::lower_bound(b, e, a, [&](const auto& i, const auto& j) {
59  return i.x < j;
60  });
61 
62  if (it == b) {
63  auto tmp = *b;
64  return tmp.y;
65  }
66 
67  if (it == e) {
68  auto tmp = *(e - 1);
69  return tmp.y;
70  }
71 
72  const auto a1 = *(it - 1);
73  const auto a2 = *it;
74 
75  return interp(a, a1.x, a2.x, a1.y, a2.y, std::forward<Func>(func));
76 }
77 
78 } // namespace core
79 } // namespace wayverb
Definition: traits.cpp:2
Definition: cosine_interp.h:22
Definition: capsule_base.h:9
Definition: cosine_interp.h:37