// 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"

// function initializing boundary curves
void init_bcurves(nbspline &crvU1,nbspline&crvU2,nbspline &crvV1,nbspline&crvV2);


// fonction the computes a surface with minimal area
void compute_minimal_surface(nbspline &crvU1,nbspline&crvU2,nbspline &crvV1,nbspline&crvV2,
            nbsplinesurface &surf)
{
  // to code
}

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

  const int nCP=7;
  const int degree=6;
  nbspline crv_u1(nCP,degree),crv_u2(nCP,degree); // boundary curves
  nbspline crv_v1(nCP,degree),crv_v2(nCP,degree);

  nbsplinesurface mini;

  init_bcurves(crv_u1,crv_u2,crv_v1,crv_v2);

  compute_minimal_surface(crv_u1,crv_u2,crv_v1,crv_v2,mini); // call to the function computing a surface of minimal area


  // display curves & patch
  crv_u1.Display(data);
  crv_u2.Display(data);
  crv_v1.Display(data);
  crv_v2.Display(data);
  mini.Display(data);
  display.init_data(data);
  display.display();
  return 0;
}


void init_bcurves(nbspline &crvU1,nbspline &crvU2,nbspline &crvV1,nbspline &crvV2)
{
  int degree=crvU1.degree();// supposed all of the same degree
  for (int i=0;i<degree+1;++i)
  {
    crvU1.CP(i)=npoint(i,0,sin(i*1.0/(degree)*n_pi));
    crvU1.u(i)=0.0;
    crvU1.u(i+degree+1)=1.0;
    crvU2.CP(i)=npoint(i,degree,-sin(i*4.0/(degree)*n_pi));
    crvU2.u(i)=0.0;
    crvU2.u(i+degree+1)=1.0;
    crvV1.CP(i)=npoint(0,i,sin(i*2.0/(degree)*n_pi));
    crvV1.u(i)=0.0;
    crvV1.u(i+degree+1)=1.0;
    crvV2.CP(i)=npoint(degree,i,-sin(i*3.0/(degree)*n_pi));
    crvV2.u(i)=0.0;
    crvV2.u(i+degree+1)=1.0;
  }
}
