// 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 "nbezierconvexpoly.h"
#include "ndisplay.h"
#include "time.h"

int main(void)
{
  int ns=6;
  int deg=2;

  /*
  polyindex pit(deg,ns);
  do{
    pit.print();
  }while (pit.inc());
  std::cout << pit.getnumindexes() << std::endl;
  return 0;

  
  int tab[]={-1,1,3,10,11,12,13,14};
  std::vector<int> map(tab,tab+8);
  int n=9;
 // std::vector<int>::iterator it= std::lower_bound(map.begin(), map.end(), n);
  std::vector<int>::iterator it= binary_find(map.begin(), map.end(), n);
  std::cout << *it <<  " " <<  n << " " << std::distance(map.begin(), it) << std::endl;
  if (it!=map.end()) if (*it==n) std::cout << std::distance(map.begin(), it) << std::endl;
  
  */
  data_container data;
  ndisplay display;
  nbezierconvexpoly poly(deg,ns);
  std::vector<npoint> pts(ns);
  for (int i=0;i<ns;++i)
  {
    pts[i]=npoint(cos(i*2*M_PI/ns)/2.,sin(i*2*M_PI/ns)/2.,0,1);
  }

  int k=0;
  for (int m=0;m<7;++m)
  {
    for (int n=0;n<(3-m%2);++n)
    {
      for (polyindex pi(deg,ns);!pi.end();++pi)
      {

        std::vector<int> ndx;
        pi.getindex(ndx);
        npoint pt;
        for (int i=0;i<ns;++i)
        {
          pt+=pts[i]*ndx[i]/deg;
//          pt[2]+=0.05*(rand()%10000)/9999.;
    //      pt[1]+=0.05*(rand()%10000)/9999.;
        }
//      if (k==3) pt+=npoint(0,0,2,0);
        pt[0]+=1.5*n+0.75*(m%2);
        pt[1]+=sqrt(3)/4.*m;
        pt[2]=sin(pt[1]*M_PI*2/sqrt(3))*0.5;
        poly.CP(pi)=pt;
        ++k;
      }
      properties p;
      p.pointsize=5;
      data.setproppoints(p);
      npoint pp;
      poly.P(0,0,pp);
      poly.Display(data);
    }
  }
  display.init_data(data);
  display.display();
  return 0;
}
