// Gnurbs - A curve and surface library
// Copyright (C) 2008-2026 Eric Bechet
//
// See the LICENSE file for contributions and license information.
// Please report all bugs and problems to <bechet@cadxfem.org>.
//

#include <iostream>
#include <vector>

#include "nvtkdisplay.h"
#include "nbsplinesurface.h"

// fonction that computes the intersection between two surfaces
void intersect(nparametricsurface &surf1,nparametricsurface &surf2 ,std::vector<npoint3> &pts,std::vector<npoint3> &param1,std::vector<npoint3> &param2)
{
  // to code
  std::cout << pts.size() << " intersection points" << std::endl;
}


//function to initialize the surface
void initsurface(nbsplinesurface &surf,double DX,double DY,double DZ);



int main(void)
{
  data_container data;
  nvtkdisplay display;

  std::vector<npoint3> ilist; // intersection points (xyz)
  std::vector<npoint3> ilist_p1; // intersection points (uv) surface 1
  std::vector<npoint3> ilist_p2; // intersection points (uv) surface 2
  nbsplinesurface surface1(6,3,6,3);
  initsurface(surface1,0,0,0);
  nbsplinesurface surface2(4,2,8,4);
  initsurface(surface2,0.5,0.25,0);
  intersect(surface1,surface2,ilist,ilist_p1,ilist_p2); // call to the intersection function

  if (ilist.size()!=1)
    for (int i=1;i<ilist.size();++i) {line l;l.pts[0]=ilist[i-1]; l.pts[1]=ilist[i];data.add_line(l);}
  else
    data.add_point(ilist[0]);
  surface1.Display(data);
  surface2.Display(data);
  display.init_data(data);
  display.display();
  return 0;
}



//function to initialize the surface (implementation)
void initsurface(nbsplinesurface &surf,double DX,double DY,double DZ)
{
  for (int i=0;i<surf.nb_CP_u();++i)
  {
    for (int j=0;j<surf.nb_CP_v();++j)
    {
      double R=1.5;
      double x=i*2/((double)surf.nb_CP_u()-1)-1;
      double y=j*2/((double)surf.nb_CP_v()-1)-1;
      double rr=x*x+y*y;
      double z=sqrt(R*R-rr)-0.9;
      z=z*z*5;
      npoint p(x+DX,y+DY,z+DZ,1.0);
      surf.CP(i,j)=p;
    }
  }
  int endsu=surf.degree_u()+1;
  int du=surf.degree_u();
  int cpsu=surf.nb_CP_u()-1;
  for (int i=0;i<endsu;++i)
  {
    surf.u(i)=0.0;
    surf.u(cpsu+du+1-i)=(cpsu+du+2-2*endsu+1);
  }
  for (int i=1;i<=(cpsu+du+2-2*endsu);++i)
  {
    surf.u(i+endsu-1)=i;
  }
  int endsv=surf.degree_v()+1;
  int dv=surf.degree_v();
  int cpsv=surf.nb_CP_v()-1;

  for (int i=0;i<endsv;++i)
  {
    surf.v(i)=0.0;
    surf.v(cpsv+dv+1-i)=(cpsv+dv+2-2*endsv+1);
  }
  for (int i=1;i<=(cpsv+dv+2-2*endsv);++i)
  {
    surf.v(i+endsv-1)=i;
  }

}

