Free Electron
Vector2.h
Go to the documentation of this file.
1 /* Copyright (C) 2003-2021 Free Electron Organization
2  Any use of this software requires a license. If a valid license
3  was not distributed with this file, visit freeelectron.org. */
4 
5 /** @file */
6 
7 #ifndef __math_Vector2_h__
8 #define __math_Vector2_h__
9 
10 namespace fe
11 {
12 
13 typedef Vector<2,double> Vector2d;
14 typedef Vector<2,float> Vector2f;
15 typedef Vector<2,FE_UWORD> Vector2u;
16 typedef Vector<2,I32> Vector2i;
17 typedef Vector<2,Real> Vector2;
18 
19 template<>
20 inline Vector<2,F32>::Vector(void)
21 {
22  m_data[0]=0.0f;
23  m_data[1]=0.0f;
24 }
25 
26 template<>
27 template<typename U>
28 inline Vector<2,F32>::Vector(const Vector<2,U>& other)
29 {
30  m_data[0]=other[0];
31  m_data[1]=other[1];
32 }
33 
34 template<class T>
35 inline Vector<2,T>& set(Vector<2,T> &lhs)
36 {
37  lhs[0]=(T)0.0;
38  lhs[1]=(T)0.0;
39  return lhs;
40 }
41 
42 template<class T, typename U, typename V>
43 inline Vector<2,T>& set(Vector<2,T> &lhs, U x, V y=0.0)
44 {
45  lhs[0]=(T)x;
46  lhs[1]=(T)y;
47  return lhs;
48 }
49 
50 template<class T>
51 inline Vector<2,T> operator+(const Vector<2,T> &lhs,const Vector<2,T> &rhs)
52 {
53  return Vector<2,T>(lhs[0]+rhs[0],lhs[1]+rhs[1]);
54 }
55 
56 template<class T>
57 inline Vector<2,T> operator-(const Vector<2,T> &lhs,const Vector<2,T> &rhs)
58 {
59  return Vector<2,T>(lhs[0]-rhs[0],lhs[1]-rhs[1]);
60 }
61 
62 // from numerical recipes
63 template<class T>
64 inline void polyInterp(const Array<Vector<2,T> > &a_xy, const T &a_x,
65  T &a_y, T &a_dy)
66 {
67  I32 ns=0;
68  T den, dif, dift, ho, hp, w;
69 
70  I32 n = a_xy.size();
71 
72  dif = fabs(a_x - a_xy[0][0]);
73  Array<T> c(n);
74  Array<T> d(n);
75 
76  for(I32 i=0; i < n; i++)
77  {
78  if((dift=fabs(a_x - a_xy[i][0])) < dif)
79  {
80  ns = i;
81  dif = dift;
82  }
83  c[i] = a_xy[i][1];
84  d[i] = a_xy[i][1];
85  }
86  a_y = a_xy[ns--][1];
87  for(I32 m = 1; m < n; m++)
88  {
89  for(I32 i = 0; i < n-m; i++)
90  {
91  ho=a_xy[i][0]-a_x;
92  hp=a_xy[i+m][0]-a_x;
93  w=c[i+1]-d[i];
94  if( (den=ho-hp) == 0.0 ) { feX("polyInterp failure"); }
95  den=w/den;
96  d[i]=hp*den;
97  c[i]=ho*den;
98  }
99  a_y += (a_dy=( 2*ns < (n-m-1) ? c[ns+1] : d[ns--] ));
100  }
101 }
102 
103 } /* namespace */
104 
105 
106 #endif /* __math_Vector2_h__ */
kernel
Definition: namespace.dox:3