279ed9129f7b0e42fe6934c67aa2c5e2f00103ce
[synfig.git] / ETL / trunk / ETL / _calculus.h
1 /*! ========================================================================
2 ** Extended Template and Library
3 ** Calculus Functional Classes Implementation
4 ** $Id$
5 **
6 ** Copyright (c) 2002 Robert B. Quattlebaum Jr.
7 **
8 ** This package is free software; you can redistribute it and/or
9 ** modify it under the terms of the GNU General Public License as
10 ** published by the Free Software Foundation; either version 2 of
11 ** the License, or (at your option) any later version.
12 **
13 ** This package is distributed in the hope that it will be useful,
14 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 ** General Public License for more details.
17 **
18 ** === N O T E S ===========================================================
19 **
20 ** ========================================================================= */
21
22 /* === S T A R T =========================================================== */
23
24 #ifndef __ETL__CALCULUS_H
25 #define __ETL__CALCULUS_H
26
27 /* === H E A D E R S ======================================================= */
28
29 #include <functional>
30
31 /* === M A C R O S ========================================================= */
32
33 //#ifndef _EPSILON
34 //#define _EPSILON              0.0000001
35 //#endif
36
37 /* === T Y P E D E F S ===================================================== */
38
39 /* === C L A S S E S & S T R U C T S ======================================= */
40
41 _ETL_BEGIN_NAMESPACE
42
43 template <typename T>
44 class derivative : public std::unary_function<typename T::argument_type,typename T::result_type>
45 {
46         T func;
47         typename T::argument_type epsilon;
48 public:
49         explicit derivative(const T &x, const typename T::argument_type &epsilon=0.000001):func(x),epsilon(epsilon) { }
50
51         typename T::result_type
52         operator()(const typename T::argument_type &x)const
53         {
54                 return (func(x+epsilon)-func(x))/epsilon;
55         }
56 };
57
58 template <typename T>
59 class integral : public std::binary_function<typename T::argument_type,typename T::argument_type,typename T::result_type>
60 {
61         T func;
62         int samples;
63 public:
64         explicit integral(const T &x, const int &samples=500):func(x),samples(samples) { }
65
66         typename T::result_type
67         operator()(typename T::argument_type x,typename T::argument_type y)const
68         {
69                 typename T::result_type ret=0;
70                 int i=samples;
71                 const typename T::argument_type increment=(y-x)/i;
72
73                 for(;i;i--,x+=increment)
74                         ret+=(func(x)+func(x+increment))*increment/2;
75                 return ret;
76         }
77 };
78
79 _ETL_END_NAMESPACE
80
81 /* === E N D =============================================================== */
82
83 #endif