Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.16 KB | None | 0 0
  1. #ifndef LINEARINTERPOLATE_H
  2. #define LINEARINTERPOLATE_H
  3.  
  4. #include<assert.h>
  5.  
  6. namespace FL{
  7.  
  8. typedef unsigned int uint;
  9.  
  10. template< int DIM, typename T = long double>
  11. struct point{
  12. T coords [DIM] ;
  13. T val;
  14.  
  15. inline const T coord(const int c) const{
  16. assert(c >= 0 && c < DIM);
  17. return coords[c];
  18. }
  19. };
  20.  
  21.  
  22. template <class T>
  23. class LinearInterpolator{
  24.  
  25. public:
  26.  
  27. /*
  28. y
  29. ^ p1
  30. | /
  31. | /
  32. | /
  33. | p
  34. | /
  35. | p0
  36. |
  37. |
  38. o-------------------------> x
  39.  
  40. */
  41. /* P: point the lie between a and b
  42. * a,b boundary of the 1D cuboid, a<=b
  43. */
  44. point<1,T>& Linear ( point<1,T>& p , const point<1,T>&a, const point<1,T>&b, int c=0 ){
  45. T x_d = (p.coord(c)-a.coord(c)) * (1/(b.coord(c) - a.coord(c)));
  46. p.val = Linear(a.val,b.val,x_d);
  47. return p;
  48. }
  49.  
  50. /* P: point the lie inside the cuboid defined by the first two values of v
  51. * v[0] <= v[1]
  52. */
  53. point<1,T>& Linear ( point<1,T>& p , const point<1,T>* v , int c=0 ){
  54. T x_d = (p.coord(c)-v[0].coord(c)) * (1/(v[1].coord(c) - v[0].coord(c)));
  55. p.val = Linear(v[0].val,v[1].val,x_d);
  56. return p;
  57. }
  58.  
  59. /*----------------BILINEAR------------------------
  60. y
  61. ^
  62. | p2.......p3
  63. | . .
  64. | . .
  65. | . .
  66. | . .
  67. | p0.......p1
  68. |
  69. |
  70. o-------------------------> x
  71.  
  72. p point that lie in the cuboid defined by the 4 values array v
  73. -------------------------------------------------*/
  74.  
  75. point<2,T>& Bilinear ( point<2,T>& p , const point<2,T>*v ){
  76. T x_d = (p.coord(0)-v[0].coord(0)) * (1/(v[1].coord(0) - v[0].coord(0)));
  77. T y_d = (p.coord(1)-v[0].coord(1)) * (1/(v[2].coord(1) - v[0].coord(1)));
  78. p.val = Bilinear(v[0].val,v[1].val,v[2].val,v[3].val,x_d,y_d);
  79. return p;
  80. }
  81.  
  82.  
  83.  
  84. /*----------------TRILINEAR------------------------
  85. *
  86. y p6____________p7
  87. ^ / | /|
  88. | / | / |
  89. | / | / |
  90. | p2___|_________p3 |
  91. | | | | |
  92. | | p4_________|__p5
  93. | | / | /
  94. | | / | /
  95. | | / |/
  96. | p0_____________p1
  97. |
  98. |-------------------------> x
  99. /
  100. /
  101. /
  102. /
  103. /
  104. z/
  105.  
  106.  
  107. p point that lie in the cuboid defined by the 8 values array v
  108. -------------------------------------------------*/
  109.  
  110. point<3,T>& Trilinear ( point<3,T>& p , const point<3,T>*v ){
  111. T x_d = (p.coord(0)-v[0].coord(0)) * (1/(v[1].coord(0) - v[0].coord(0)));
  112. T y_d = (p.coord(1)-v[0].coord(1)) * (1/(v[2].coord(1) - v[0].coord(1)));
  113. T z_d = (p.coord(2)-v[0].coord(2)) * (1/(v[4].coord(2) - v[0].coord(2)));
  114. p.val =Trilinear(v[0].val,v[1].val,v[2].val,v[3].val,v[4].val,v[5].val,v[6].val,v[7].val,
  115. x_d,y_d,z_d);
  116.  
  117. return p;
  118. }
  119.  
  120.  
  121.  
  122. private:
  123. inline T Linear(const T f0, const T f1, const T xd){
  124. //return std::fma(f0, (1-xd) , f1*xd);
  125. return f0*(1.0-xd) + f1*xd;
  126. }
  127.  
  128. inline T Bilinear(const T f00,const T f10,const T f01, const T f11, const T xd, const T yd){
  129. const T c0 = f00*(static_cast<T>(1.0)-xd) + f10*xd;
  130. const T c1 = f01*(static_cast<T>(1.0)-xd) + f11*xd;
  131. return Linear(c0,c1,yd);
  132. }
  133.  
  134. inline T Trilinear(const T f000, const T f100,const T f010,const T f110,const T f001, const T f101,const T f011,const T f111,const T xd,const T yd ,const T zd){
  135. const T c0 = Bilinear(f000,f100,f010,f110,xd,yd);
  136. const T c1 = Bilinear(f001,f101,f011,f111,xd,yd);
  137. return Linear(c0,c1,zd);
  138. }
  139. }; //class interpolator
  140.  
  141. }
  142. #endif /* INTERPOLATE */
  143.  
  144. T x_d = (p.coord(c)-a.coord(c)) * (1/(b.coord(c) - a.coord(c)));
  145.  
  146. T x_d = (p.coord(c)-a.coord(c)) / (b.coord(c) - a.coord(c));
  147.  
  148. private:
  149. static constexpr T unity = 1.0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement