summaryrefslogtreecommitdiff
path: root/src/components/utility/LinearApproximation.h
blob: f7104ced280d57c47226d8454eedeb70e54c55be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#pragma once

#include <cstddef>
#include <array>

namespace Pinetime {
  namespace Utility {

    // based on: https://github.com/SHristov92/LinearApproximation/blob/main/Linear.h
    template <typename Key, typename Value, std::size_t Size> class LinearApproximation {
      using Point = struct {
        Key key;
        Value value;
      };

    public:
      LinearApproximation(const std::array<Point, Size>&& sorted_points) : points {sorted_points} {
      }

      Value GetValue(Key key) const {
        if (key <= points[0].key) {
          return points[0].value;
        }

        for (std::size_t i = 1; i < Size; i++) {
          const auto& p = points[i];
          const auto& p_prev = points[i - 1];

          if (key < p.key) {
            return p_prev.value + (key - p_prev.key) * (p.value - p_prev.value) / (p.key - p_prev.key);
          }
        }

        return points[Size - 1].value;
      }

    private:
      std::array<Point, Size> points;
    };
  }
}