// 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 "nbeziercurve.h"
#include "nutil.h"
#include <iostream>
#include <limits>
#include <iomanip>

int main ( int argc, char *argv[] )
{
  nbeziercurve bez ( 5 );
  bez.CP ( 0 ) =npoint ( 0,0,0 );
  bez.CP ( 1 ) =npoint ( 1.1,0,0 );
  bez.CP ( 2 ) =npoint ( 1.1,1.1,0 );
  bez.CP ( 3 ) =npoint ( 0,2.2,0 );
  bez.CP ( 4 ) =npoint ( 0,4.4,0 );
  nbeziercurve dbez ( 4 );
  dbez.CP ( 0 ) =npoint ( 4.4,0,0 );
  dbez.CP ( 1 ) =npoint ( 0,4.4,0 );
  dbez.CP ( 2 ) =npoint ( -4.4,4.4,0 );
  dbez.CP ( 3 ) =npoint ( 0,8.8,0 );
  nbeziercurve d2bez ( 3 );
  d2bez.CP ( 0 ) =npoint ( -13.2,13.2,0 );
  d2bez.CP ( 1 ) =npoint ( -13.2,0.,0 );
  d2bez.CP ( 2 ) =npoint ( 13.2,13.2,0 );

  
  std::cout << std::scientific << std::setprecision(18) << std::showpos;
  for (ncurve::FPeps=1;ncurve::FPeps>=1.22e-17;ncurve::FPeps/=2)
  {
    ncurve::update_FPeps(true);
    npoint res;
    bez.P ( 0.5,res );
    npoint derres;
    bez.dPdu ( 0.5,derres );
    npoint der2res;
    bez.d2Pdu2 ( 0.5,der2res );
    npoint derres2;
    dbez.P( 0.5,derres2 );
    npoint der2res2;
    d2bez.P( 0.5,der2res2 );
    std::cout << res[0]-0.625*1.1 << " " << res[1]-1.125*1.1 << " " << res[2] << std::endl;
//    std::cout << ncurve::FPeps << " " <<  fabs((derres[0]+1.1)/1.1) << " " << fabs((derres[1]-4.4)/4.4) << " " << fabs((der2res[0]+6.6)/6.6) << " " << fabs((der2res[1]-6.6)/6.6) << std :: endl;
  }
}
// kate: indent-mode cstyle; indent-width 2; replace-tabs on; 
