Direct Graphical Models  v.1.7.0
LinearMapper.h
1 // Linear Mapper set of functions
2 // Written by Sergey G. Kosov in 2015 - 2016 for Project X
3 #pragma once
4 
5 #include "types.h"
6 #include "macroses.h"
7 
8 namespace DirectGraphicalModels { namespace fex
9 {
21  template <typename T>
22  inline T linear_mapper(float val, float min, float max)
23  {
24  DGM_ASSERT(max > min);
25  float tMin = static_cast<float>(std::numeric_limits<T>::min());
26  float tMax = static_cast<float>(std::numeric_limits<T>::max());
27  float a = (tMax - tMin) / (max - min);
28  float b = tMin - a * min;
29  float x = a * val + b;
30  return static_cast<T>(MAX(tMin, MIN(tMax, std::round(x))));
31  }
32 
46  template<typename T>
47  inline T two_linear_mapper(float val, float min, float max, float mid, T midPoint)
48  {
49  if ((mid == min) || (mid == max)) return linear_mapper<T>(val, min, max);
50  DGM_ASSERT(max > mid);
51  DGM_ASSERT(mid > min);
52  float tMin = static_cast<float>(std::numeric_limits<T>::min());
53  float tMid = static_cast<float>(midPoint);
54  float tMax = static_cast<float>(std::numeric_limits<T>::max());
55 
56  float a, b;
57  if (val < mid) {
58  a = (tMid - tMin) / (mid - min);
59  b = tMin - a * min;
60  }
61  else {
62  a = (tMax - tMid) / (max - mid);
63  b = tMid - a * mid;
64  }
65 
66  float x = a * val + b;
67  return static_cast<T>(MAX(tMin, MIN(tMax, std::round(x))));
68  }
69 
70 } }
T two_linear_mapper(float val, float min, float max, float mid, T midPoint)
Two-linear 1D mapping.
Definition: LinearMapper.h:47
T linear_mapper(float val, float min, float max)
Linear 1D mapping.
Definition: LinearMapper.h:22