X-Git-Url: https://git.pterodactylus.net/?a=blobdiff_plain;f=ETL%2Ftrunk%2FETL%2F_calculus.h;h=45c8ed48960378df1a83a173a9d958fc61f76b47;hb=9459638ad6797b8139f1e9f0715c96076dbf0890;hp=a9c95edc8601e10b37c56d62d246cd4ea9b2ad3b;hpb=36d01e1527fda602a9aed07d209eb34e6770bca8;p=synfig.git diff --git a/ETL/trunk/ETL/_calculus.h b/ETL/trunk/ETL/_calculus.h index a9c95ed..45c8ed4 100644 --- a/ETL/trunk/ETL/_calculus.h +++ b/ETL/trunk/ETL/_calculus.h @@ -4,6 +4,7 @@ ** $Id$ ** ** Copyright (c) 2002 Robert B. Quattlebaum Jr. +** Copyright (c) 2008 Chris Moore ** ** This package is free software; you can redistribute it and/or ** modify it under the terms of the GNU General Public License as @@ -28,14 +29,14 @@ #include +#include "hermite" + /* === M A C R O S ========================================================= */ //#ifndef _EPSILON //#define _EPSILON 0.0000001 //#endif -#define ETL_FIXED_DERIVATIVE 1 - /* === T Y P E D E F S ===================================================== */ /* === C L A S S E S & S T R U C T S ======================================= */ @@ -53,11 +54,23 @@ public: typename T::result_type operator()(const typename T::argument_type &x)const { -#ifdef ETL_FIXED_DERIVATIVE return (func(x+epsilon)-func(x))/epsilon; -#else - return (func(x)-func(x+epsilon))/epsilon; -#endif + } +}; + +template +class derivative > : public std::unary_function::argument_type,typename hermite::result_type> +{ + hermite func; +public: + explicit derivative(const hermite &x):func(x) { } + + typename hermite::result_type + operator()(const typename hermite::argument_type &x)const + { + T a = func[0], b = func[1], c = func[2], d = func[3]; + typename hermite::argument_type y(1-x); + return ((b-a)*y*y + (c-b)*x*y*2 + (d-c)*x*x) * 3; } };