Simbody  3.4
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Spline.h
Go to the documentation of this file.
1 #ifndef SimTK_SIMMATH_SPLINE_H_
2 #define SimTK_SIMMATH_SPLINE_H_
3 
4 /* -------------------------------------------------------------------------- *
5  * Simbody(tm): SimTKmath *
6  * -------------------------------------------------------------------------- *
7  * This is part of the SimTK biosimulation toolkit originating from *
8  * Simbios, the NIH National Center for Physics-Based Simulation of *
9  * Biological Structures at Stanford, funded under the NIH Roadmap for *
10  * Medical Research, grant U54 GM072970. See https://simtk.org/home/simbody. *
11  * *
12  * Portions copyright (c) 2008-13 Stanford University and the Authors. *
13  * Authors: Peter Eastman *
14  * Contributors: Michael Sherman *
15  * *
16  * Licensed under the Apache License, Version 2.0 (the "License"); you may *
17  * not use this file except in compliance with the License. You may obtain a *
18  * copy of the License at http://www.apache.org/licenses/LICENSE-2.0. *
19  * *
20  * Unless required by applicable law or agreed to in writing, software *
21  * distributed under the License is distributed on an "AS IS" BASIS, *
22  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
23  * See the License for the specific language governing permissions and *
24  * limitations under the License. *
25  * -------------------------------------------------------------------------- */
26 
27 #include "SimTKcommon.h"
30 
31 #include <limits>
32 
33 namespace SimTK {
34 
51 template <class T>
52 class Spline_ : public Function_<T> {
53 public:
64  Spline_(int degree, const Vector& x, const Vector_<T>& y)
65  : impl(new SplineImpl(degree, x, y)) {}
66 
69  Spline_() : impl(NULL) {}
70 
73  Spline_(const Spline_& source) : impl(source.impl)
74  { if (impl) impl->referenceCount++; }
75 
78  Spline_& operator=(const Spline_& source) {
79  if (impl) {
80  impl->referenceCount--;
81  if (impl->referenceCount == 0)
82  delete impl;
83  }
84  impl = source.impl;
85  if (impl) impl->referenceCount++;
86  return *this;
87  }
88 
92  if (impl) {
93  impl->referenceCount--;
94  if (impl->referenceCount == 0)
95  delete impl;
96  }
97  }
98 
103  T calcValue(Real x) const {
104  assert(impl);
105  return impl->getValue(x);
106  }
107 
118  T calcDerivative(int order, Real x) const {
119  assert(impl);
120  assert(order > 0);
121  return impl->getDerivative(order, x);
122  }
123 
127  assert(impl);
128  return impl->x;
129  }
133  assert(impl);
134  return impl->y;
135  }
136 
138  int getSplineDegree() const {
139  assert(impl);
140  return impl->degree;
141  }
142 
145  T calcValue(const Vector& x) const OVERRIDE_11 {
146  assert(x.size() == 1);
147  return calcValue(x[0]);
148  }
155  T calcDerivative(const Array_<int>& derivComponents, const Vector& x) const
157  { assert(x.size() == 1);
158  return calcDerivative((int)derivComponents.size(), x[0]); }
161  T calcDerivative(const std::vector<int>& derivComponents,
162  const Vector& x) const
163  { assert(x.size() == 1);
164  return calcDerivative((int)derivComponents.size(), x[0]); }
165 
167  int getArgumentSize() const OVERRIDE_11 {return 1;}
170  { return std::numeric_limits<int>::max(); }
171 
172 private:
173  class SplineImpl;
174  SplineImpl* impl;
175 };
176 
179 
181 template <class T>
182 class Spline_<T>::SplineImpl {
183 public:
184  SplineImpl(int degree, const Vector& x, const Vector_<T>& y)
185  : referenceCount(1), degree(degree), x(x), y(y) {}
187  assert(referenceCount == 0);
188  }
189  T getValue(Real t) const {
190  return GCVSPLUtil::splder(0, degree, t, x, y);
191  }
192  T getDerivative(int derivOrder, Real t) const {
193  return GCVSPLUtil::splder(derivOrder, degree, t, x, y);
194  }
196  int degree;
199 };
200 
201 } // namespace SimTK
202 
203 #endif // SimTK_SIMMATH_SPLINE_H_
204 
205