Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

sxy_series_parabolic.cpp

Go to the documentation of this file.
00001 
00002 // =======================================================================
00003 
00004 char* series_parabolic_cpp = "$Id: sxy_series_parabolic.cpp,v 1.1 2002/11/28 20:57:13 clinio Exp $";
00005 
00006 // =======================================================================
00007 
00008 #include <float.h>
00009 #include "sxy_series_parabolic.h"
00010 
00011 // =======================================================================
00012 
00013 // .......................................................................
00014 
00015 SXYParabolicSeries::SXYParabolicSeries(unsigned int buffer_size, 
00016 unsigned int resolution) : 
00017 SXYCoeficientsAproximationSeries(3, buffer_size, resolution) { 
00018 }
00019 
00020 // .......................................................................
00021 
00022 SXYParabolicSeries::~SXYParabolicSeries(void) {
00023 }
00024 
00025 // .......................................................................
00026 
00027 unsigned int SXYParabolicSeries::aproxFunctionCallback( double x, double& y ) {
00028    double A, B, C;
00029    if (!getCoeficient(0, A) || 
00030        !getCoeficient(1, B) ||
00031        !getCoeficient(2, C) ) return 0;
00032    y = A*x*x + B*x + C;
00033    return 1;
00034 }
00035 
00036 // .......................................................................
00043 unsigned int SXYParabolicSeries::calculateCoeficients(unsigned int n, 
00044 double* buffer_x, double* buffer_y) {
00045 
00046   if ( n <= 2 ) return 0;
00047 
00048   double* x = buffer_x;
00049   double* y = buffer_y;
00050 
00051   double x0 = n;
00052   double x1 = 0;
00053   double x2 = 0;
00054   double x3 = 0;
00055   double x4 = 0;
00056 
00057   double p0 = 0;
00058   double p1 = 0;
00059   double p2 = 0;
00060 
00061   for (unsigned int i = 0 ; i < n ; i++) { 
00062      x1 = x1 + x[i];
00063      x2 = x2 + x[i]*x[i];
00064      x3 = x3 + x[i]*x[i]*x[i];
00065      x4 = x4 + x[i]*x[i]*x[i]*x[i];
00066      p0 = p0 + y[i];
00067      p1 = p1 + x[i]*y[i];
00068      p2 = p2 + x[i]*x[i]*y[i];
00069   }
00070 
00071   double den = ( -(x2*x2*x2) + 2*x1*x2*x3 - x0*x3*x3  - x1*x1*x4 + x0*x2*x4 );
00072   if (den < 1e-10) return 0;
00073 
00074   double A = ( -(p2*x1*x1) + p2*x0*x2 + p1*x1*x2 - 
00075                 p0*x2*x2 - p1*x0*x3 + p0*x1*x3 ) / den;
00076 
00077   double B = ( p2*x1*x2 - p1*x2*x2  - p2*x0*x3 + 
00078                p0*x2*x3 + p1*x0*x4 - p0*x1*x4 ) / den;
00079 
00080   double C = ( -(p2*x2*x2) + p2*x1*x3 + p1*x2*x3 - 
00081                p0*x3*x3 - p1*x1*x4 + p0*x2*x4 ) / den;
00082 
00083   setCoeficient(0,A);
00084   setCoeficient(1,B);
00085   setCoeficient(2,C);
00086   return 1;
00087 }
00088 
00089 

SXY
Tecgraf / PUC-Rio - Computer Graphics Technology Group