OpenWalnut  1.5.0dev
WMPickingDVRHelper.cpp
1 //---------------------------------------------------------------------------
2 //
3 // Project: OpenWalnut ( http://www.openwalnut.org )
4 //
5 // Copyright 2017 OpenWalnut Community
6 // For more information see http://www.openwalnut.org/copying
7 //
8 // This file is part of OpenWalnut.
9 //
10 // OpenWalnut is free software: you can redistribute it and/or modify
11 // it under the terms of the GNU Lesser General Public License as published by
12 // the Free Software Foundation, either version 3 of the License, or
13 // (at your option) any later version.
14 //
15 // OpenWalnut is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 // GNU Lesser General Public License for more details.
19 //
20 // You should have received a copy of the GNU Lesser General Public License
21 // along with OpenWalnut. If not, see <http://www.gnu.org/licenses/>.
22 //
23 //---------------------------------------------------------------------------
24 
25 #include <vector>
26 
27 #include "WMPickingDVRHelper.h"
28 
29 namespace PickingDVRHelper
30 {
31  /**
32  * Computes the first and second derivatives of a vector of values
33  *
34  * \param values Values for which the derivatives will be computed
35  * \param vecFirstDerivative The first derivative of the values
36  * \param vecSecondDerivative The second derivative of the values
37  */
38  void calculateDerivativesWYSIWYP( const std::vector<double>& values,
39  std::vector<double>& vecFirstDerivative,
40  std::vector<double>& vecSecondDerivative )
41  {
42  //Fourth Order Finite Differencing by Daniel Gerlicher
43  unsigned int n = values.size();
44  double deriv = 0.0;
45  double coeff = 1.0 / 12.0;
46 
47  //Calculate first derivative
48  for( unsigned int j = 0; j < n; j++ )
49  {
50  //Forward Diff
51  if( j == 0 )
52  {
53  deriv = coeff * ( -25 * values[j]
54  + 48 * values[j+1]
55  - 36 * values[j+2]
56  + 16 * values[j+3]
57  - 3 * values[j+4] );
58  }
59  else if( j == 1 )
60  {
61  deriv = coeff * ( -3 * values[j-1]
62  - 10 * values[j]
63  + 18 * values[j+1]
64  - 6 * values[j+2]
65  + 1 * values[j+3] );
66  }
67 
68  //Backward Diff
69  else if( j == n - 1 )
70  {
71  deriv = coeff * ( 25 * values[j]
72  - 48 * values[j-1]
73  + 36 * values[j-2]
74  - 16 * values[j-3]
75  + 3 * values[j-4] );
76  }
77  else if( j == n - 2 )
78  {
79  deriv = coeff * ( +3 * values[j+1]
80  + 10 * values[j]
81  - 18 * values[j-1]
82  + 6 * values[j-2]
83  - 1 * values[j-3] );
84  }
85 
86  //Center
87  else
88  {
89  deriv = coeff * ( -1 * values[j+2]
90  + 8 * values[j+1]
91  - 8 * values[j-1]
92  + 1 * values[j-2] );
93  }
94 
95  vecFirstDerivative.push_back( deriv );
96  }
97 
98  //Calculate Second derivative, by applying the first derivative
99  for( unsigned int j = 0; j < n; j++ )
100  {
101  //Forward Diff
102  if( j == 0 )
103  {
104  deriv = coeff * ( -25 * vecFirstDerivative[j]
105  + 48 * vecFirstDerivative[j+1]
106  - 36 * vecFirstDerivative[j+2]
107  + 16 * vecFirstDerivative[j+3]
108  - 3 * vecFirstDerivative[j+4] );
109  }
110  else if( j == 1 )
111  {
112  deriv = coeff * ( -3 * vecFirstDerivative[j-1]
113  - 10 * vecFirstDerivative[j]
114  + 18 * vecFirstDerivative[j+1]
115  - 6 * vecFirstDerivative[j+2]
116  + 1 * vecFirstDerivative[j+3] );
117  }
118 
119  //Backward Diff
120  else if( j == n - 1 )
121  {
122  deriv = coeff * ( 25 * vecFirstDerivative[j]
123  - 48 * vecFirstDerivative[j-1]
124  + 36 * vecFirstDerivative[j-2]
125  - 16 * vecFirstDerivative[j-3]
126  + 3 * vecFirstDerivative[j-4] );
127  }
128  else if( j == n - 2 )
129  {
130  deriv = coeff * ( +3 * vecFirstDerivative[j+1]
131  + 10 * vecFirstDerivative[j]
132  - 18 * vecFirstDerivative[j-1]
133  + 6 * vecFirstDerivative[j-2]
134  - 1 * vecFirstDerivative[j-3] );
135  }
136 
137  //Center
138  else
139  {
140  deriv = coeff * ( -1 * vecFirstDerivative[j+2]
141  + 8 * vecFirstDerivative[j+1]
142  - 8 * vecFirstDerivative[j-1]
143  + 1 * vecFirstDerivative[j-2] );
144  }
145 
146  vecSecondDerivative.push_back( deriv );
147  }
148  }
149 }