// ==========================================================================
// $Id: function1d.cpp,v 1.4 2013/10/09 15:10:08 jlang Exp $
// CSI2372 example Code pointer types
// ==========================================================================
// (C)opyright:
//
//   Jochen Lang
//   SITE, University of Ottawa
//   800 King Edward Ave.
//   Ottawa, On., K1N 6N5
//   Canada. 
//   http://www.site.uottawa.ca
// 
// Creator: jlang (Jochen Lang)
// Email:   jlang@site.uottawa.ca
// ==========================================================================
// $Log: function1d.cpp,v $
// Revision 1.4  2013/10/09 15:10:08  jlang
// Updated examples for lecture on Oct. 9.
//
// Revision 1.3  2013/10/09 14:07:39  jlang
// Changed header file extension to .h
//
// Revision 1.2  2008/10/27 03:09:42  jlang
// removed extra cr
//
// Revision 1.1  2006/10/23 03:03:21  jlang
// Pointer class varibles added
//
//
// ==========================================================================
#include <iostream>
#include <math.h>

#include "function1d.h"


F1D::F1D( double _xStart, 
	  double _xEnd, 
	  double _xStep ) 
  : d_xStart( _xStart ), d_xEnd( _xEnd ), 
    d_xStep( _xStep ), d_y(0), d_nElements(0)
{
  int nElements = static_cast<int>((d_xEnd-d_xStart)/d_xStep + 0.5);
  if ( nElements > 0 ) { 
    d_nElements = nElements+1;
    d_y = new double[d_nElements];
  }
}

#ifdef OWN_COPY
F1D::F1D( const F1D& _oF ) 
  : d_xStart( _oF.d_xStart ), d_xEnd( _oF.d_xEnd ), 
    d_xStep( _oF.d_xStep ), d_y(0), 
    d_nElements(_oF.d_nElements)
{
  if ( d_nElements > 0 ) { 
    d_y = new double[d_nElements];
    for ( int i=0; i<d_nElements; i++ ) {
      d_y[i] = _oF.d_y[i]; 
    }  
  }
}
#endif

F1D::~F1D() { 
  if ( d_y != 0 ) delete[] d_y; 
}

void F1D::evaluatePoly( double _coefficients[], int _degree )
{
  double xPos = d_xStart;
  for ( int i=0; i < d_nElements; i++ ) {
    d_y[i] = 0.0;
    for ( int deg = 0; deg <= _degree; deg++ ) {
      d_y[i] +=  _coefficients[deg] * pow( xPos, deg );
    }
    xPos += d_xStep;
  }
}

void F1D::print() {
  double xPos = d_xStart;
  for ( int i=0; i < d_nElements; i++ ) {
    std::cout << "( " << xPos << ", " << d_y[i] << " )" << std::endl;
    xPos += d_xStep;
  }
}

