// 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 "nbspline.h"
#include "nbsplinesurface.h"

// fonction that computes the intersection between a surface and a curve
void intersect(nparametricsurface &surf,nparametriccurve &crv, std::vector<npoint3> &pts,std::vector<npoint3> &param)
{
  // partie a coder.
  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
  std::vector<npoint3> ilist_p; // u and v, and t
  nbsplinesurface surface(6,3,6,3);
  nbspline curve(6,3);
  curve.u(0)=0.;  curve.u(1)=0.;
  curve.u(2)=0.;  curve.u(3)=0.;
  curve.u(4)=1.;
  curve.u(5)=2.;  curve.u(6)=2.;
  curve.u(7)=2.;  curve.u(8)=2.;
  curve.CP(0)=npoint(0,0,0,1);
  curve.CP(1)=npoint(0,1,0,1);
  curve.CP(2)=npoint(1,0,1,1);
  curve.CP(3)=npoint(1,1,0,1);
  curve.CP(4)=npoint(1,2,0,1);
  initsurface(surface,0.5,0.5,-1);
  intersect(surface,curve,ilist,ilist_p); // 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]);
  surface.Display(data);
  curve.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;
  }

}

