/* Chris von Krogh
   1.12 Problem Set 6 */

// macros and inclusions

#define null 0
#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <fstream.h>
#include "Matrix.cc"

/******************************************************************/

int main() {
  Matrix A(3,4);  // 0row: rpm; 1row: lbs; 2row: hp
  double temp;
  double u;
  ifstream data_str("pelton.in");
  for (int i=0;i<2;i++){
    for (int j=0;j<4;j++){
      data_str >> temp;
      A.set(i,j,temp);}}
  data_str.close();
  for (int j=0;j<4;j++)
    A.set(2,j,A.get(0,j)*A.get(1,j)/10000);
  double x0=A.get(0,0);
  double x1=A.get(0,1);
  double x2=A.get(0,2);
  double x3=A.get(0,3);
  double y0=A.get(2,0);
  double y1=A.get(2,1);
  double y2=A.get(2,2);
  double y3=A.get(2,3);
  
  Matrix B(101,2);  // the B_spline points will go in here
  for (int i=0;i<=100;i++){
    u=(double)i/100;
    temp=(1.0/6.0)*(1-u)*(1-u)*(1-u)*x0;
    temp+=(1.0/6.0)*(3*u*u*u-6*u*u+4)*x1;
    temp+=(1.0/6.0)*(-3*u*u*u+3*u*u+3*u+1)*x2;
    temp+=(1.0/6.0)*u*u*u*x3;
    B.set(i,0,temp);
    temp=(1.0/6.0)*(1-u)*(1-u)*(1-u)*y0;
    temp+=(1.0/6.0)*(3*u*u*u-6*u*u+4)*y1;
    temp+=(1.0/6.0)*(-3*u*u*u+3*u*u+3*u+1)*y2;
    temp+=(1.0/6.0)*u*u*u*y3;
    B.set(i,1,temp);}    
  
  /* for (int i=0;i<=100;i++)
     cout << i << ": " << B.get(i,0) << " " << B.get(i,1) << endl; */
  ofstream output ("B_spline.out");
  for (int i=0;i<=100;i++)
    output << B.get(i,0) << " " << B.get(i,1) << endl;
}
