#include "Surface.h"

void CopyDataToSurface(s, nrows, ncols, data)
     Surface s;
     int nrows, ncols;
     XYZ **data;
{
  int i,j, maxx, maxy, maxz, minx, miny, minz;
  
  s->nrows = nrows;
  s->ncols = ncols;
  s->data = (XYZ**)malloc(sizeof(XYZ *) * nrows);
  for (i = 0; i < nrows; i++) {
    s->data[i] = (XYZ*)malloc(sizeof(XYZ) * ncols);
    for (j = 0; j < ncols; j++) {
      s->data[i][j].x = data[i][j].x;
      s->data[i][j].y = data[i][j].y;
      s->data[i][j].z = data[i][j].z;
    }
  }
      
  maxx = minx = s->data[0][0].x;
  maxy = miny = s->data[0][0].y;
  maxz = minz = s->data[0][0].z;

  for (i = 0;i < nrows; i++) {
    for (j = 0;j < ncols; j++) {
      if(maxx < s->data[i][j].x)
	maxx = s->data[i][j].x;
      else if(minx > s->data[i][j].x)
	minx = s->data[i][j].x;

      if(maxy < s->data[i][j].y)
	maxy = s->data[i][j].y;
      else if(miny > s->data[i][j].y)
	miny = s->data[i][j].y;

      if(maxz < s->data[i][j].z)
	maxz = s->data[i][j].z;
      if(minz > s->data[i][j].z)
	minz = s->data[i][j].z;
    }
  }
}

Surface SurfaceCreate()
{
  Surface new;
  new = (Surface)malloc(sizeof(SurfaceRec));
  new->minx = new->miny = new->minz = 
    new->maxx = new->maxy = new->maxz =
      new->ncols = new->nrows = 0;
  new->data = NULL;
  return(new);
}


Surface MakeSurfaceWithData(int nrows, int ncols, XYZ **data)
{ int i, j;
  Surface new;
  new = (Surface)malloc(sizeof(SurfaceRec));
  new->nrows = nrows;
  new->ncols = ncols;
  new->data = data;
  new->maxx = new->minx = data[0][0].x;
  new->maxy = new->miny = data[0][0].y;
  new->maxz = new->minz = data[0][0].z;
  for (i = 0; i < nrows; i++) {
    for (j = 0; j < ncols; j++) {
      if(new->maxx < data[i][j].x)
	new->maxx = data[i][j].x;
      else if(new->minx > data[i][j].x)
	new->minx = data[i][j].x;

      if(new->maxy < data[i][j].y)
	new->maxy = data[i][j].y;
      else if(new->miny > data[i][j].y)
	new->miny = data[i][j].y;

      if(new->maxz < data[i][j].z)
	new->maxz = data[i][j].z;
      if(new->minz > data[i][j].z)
	new->minz = data[i][j].z;
    }
  }
  return(new);
}


void InsertData(Surface s, int nrows, int ncols, XYZ **data)
{ 
  int i, j;
  s->nrows = nrows;
  s->ncols = ncols;
  s->data = data;
  s->maxx = s->minx = s->data[0][0].x;
  s->maxy = s->miny = s->data[0][0].y;
  s->maxz = s->minz = s->data[0][0].z;
  for (i = 0; i < nrows; i++) {
    for (j = 0; j < ncols; j++) {
      if(s->maxx < s->data[i][j].x)
	s->maxx = s->data[i][j].x;
      else if(s->minx > s->data[i][j].x)
	s->minx = s->data[i][j].x;

      if(s->maxy < s->data[i][j].y)
	s->maxy = s->data[i][j].y;
      else if(s->miny > s->data[i][j].y)
	s->miny = s->data[i][j].y;

      if(s->maxz < s->data[i][j].z)
	s->maxz = s->data[i][j].z;
      if(s->minz > s->data[i][j].z)
	s->minz = s->data[i][j].z;
    }
  }
}


double SurfaceGetMinx(Surface s)
{
  return(s->minx);
}

double SurfaceGetMiny(Surface s)
{
  return(s->miny);
}

double SurfaceGetMinz(Surface s)
{
  return(s->minz);
}

double SurfaceGetMaxx(Surface s)
{
  return(s->maxx);
}

double SurfaceGetMaxy(Surface s)
{
  return(s->maxy);
}

double SurfaceGetMaxz(Surface s)
{
  return(s->maxz);
}
