#include <cassert>
#include <iostream>
using namespace std; 

#include <commandline.h>
#include <gobj.h>
#include <graphmisc.h>
#include <triangle.h>
#include <triangle3D.h>
#include <triangledisplay.h>
#include <triangletest.h>
#include <zpr.h>




void triangletest::keyboard01(unsigned char key, int x, int y)
{
  switch (key)
  {
    case 27:
      exit(0);
      break;
  }
}

void triangletest::display01()
{ 
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  assert(gobj::global!=0);
  gobj::global->draw();

  glerrordisplay();
  
  glutSwapBuffers();
}

void triangletest::test01(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,800);
  glutCreateWindow("");
  glutDisplayFunc(display01);
  glutKeyboardFunc(keyboard01);

  zpr zz;

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);
 
  commandline cmd(argc,argv);

  double a0=0.0;
  double a1=0.0;
  double b0=1.3;
  double b1=0.0;
  double c0=1.0;
  double c1=2.0;

  cmd.mapvar(a0,"a0");
  cmd.mapvar(a1,"a1");
  cmd.mapvar(b0,"b0");
  cmd.mapvar(b1,"b1");
  cmd.mapvar(c0,"c0");
  cmd.mapvar(c1,"c1");

  typedef point2<double> pt2;

  gX.set();

  triangle<pt2,double> tr( pt2(a0,a1), pt2(b0,b1), pt2(c0,c1) );

  triangledisplay< triangle<pt2,double> > td(gX,tr);

  bool off(false);
  cmd.mapvar(off,"off");
  if (off==false)
    td.turnon();

  cmd.mapvar(td.mesh,"mesh");
  cmd.mapvar(td.midpoints,"midpoints");
  cmd.mapvar(td.centroid,"centroid");
  cmd.mapvar(td.orthocenter,"orthocenter");
  cmd.mapvar(td.circumcenter,"circumcenter");
  cmd.mapvar(td.incenter,"incenter");
  cmd.mapvar(td.fermatpoint,"fermatpoint");
  cmd.mapvar(td.napoleanpoint,"napoleanpoint");
  cmd.mapvar(td.gergonnepoint,"gergonnepoint");

  td.draw();

  zz.update();
  glutMainLoop();
}





void triangletest::test02(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,800);
  glutCreateWindow("");
  glutDisplayFunc(display01);
  glutKeyboardFunc(keyboard01);

  zpr zz;

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);
 
  commandline cmd(argc,argv);

  double a0=0.0;
  double a1=0.0;
  double b0=1.3;
  double b1=0.0;
  double c0=1.0;
  double c1=2.0;

  cmd.mapvar(a0,"a0");
  cmd.mapvar(a1,"a1");
  cmd.mapvar(b0,"b0");
  cmd.mapvar(b1,"b1");
  cmd.mapvar(c0,"c0");
  cmd.mapvar(c1,"c1");

  typedef point2<double> pt2;

  gX.set();

  triangle<pt2,double> tr( pt2(a0,a1), pt2(b0,b1), pt2(c0,c1) );

  triangledisplaypoints< triangle<pt2,double> > td(gX,tr);

  bool off(false);
  cmd.mapvar(off,"off");
  if (off==false)
    td.turnon();

  cmd.mapvar(td.mesh,"mesh");
  cmd.mapvar(td.midpoints,"midpoints");
  cmd.mapvar(td.centroid,"centroid");
  cmd.mapvar(td.orthocenter,"orthocenter");
  cmd.mapvar(td.circumcenter,"circumcenter");
  cmd.mapvar(td.incenter,"incenter");
  cmd.mapvar(td.fermatpoint,"fermatpoint");
  cmd.mapvar(td.napoleanpoint,"napoleanpoint");
  cmd.mapvar(td.gergonnepoint,"gergonnepoint");

  td.draw();

  zz.update();
  glutMainLoop();
}




void triangletest::test03(int argc, char** argv)
{
  glutInit(&argc,argv);
  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  glutInitWindowSize(800,600);
  glutCreateWindow("");
  glutDisplayFunc(display01);
  glutKeyboardFunc(keyboard01);

  zpr zz;

  OpenGLinitialisation();

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_CULL_FACE);
  glEnable(GL_NORMALIZE);
 
  commandline cmd(argc,argv);

  double a0=0.0;
  double a1=0.0;
  double a2=0.0;
  double b0=1.3;
  double b1=0.0;
  double b2=0.0;
  double c0=0.5;
  double c1=0.0;
  double c2=1.0;

  cmd.mapvar(a0,"a0");
  cmd.mapvar(a1,"a1");
  cmd.mapvar(a2,"a2");
  cmd.mapvar(b0,"b0");
  cmd.mapvar(b1,"b1");
  cmd.mapvar(b2,"b2");
  cmd.mapvar(c0,"c0");
  cmd.mapvar(c1,"c1");
  cmd.mapvar(c2,"c2");

  typedef point3<double> pt3;

  gX.set();

  triangle3D<pt3,double> tr( pt3(a0,a1,a2), pt3(b0,b1,b2), 
    pt3(c0,c1,c2) );

  triangledisplay< triangle3D<pt3,double> > td(gX,tr);

  bool off(false);
  cmd.mapvar(off,"off");
  if (off==false)
    td.turnon();

  cmd.mapvar(td.mesh,"mesh");
  cmd.mapvar(td.midpoints,"midpoints");
  cmd.mapvar(td.centroid,"centroid");
  cmd.mapvar(td.orthocenter,"orthocenter");
  cmd.mapvar(td.circumcenter,"circumcenter");
  cmd.mapvar(td.incenter,"incenter");
  cmd.mapvar(td.fermatpoint,"fermatpoint");
  cmd.mapvar(td.napoleanpoint,"napoleanpoint");
  cmd.mapvar(td.gergonnepoint,"gergonnepoint");

  td.draw();

  zz.update();
  glutMainLoop();
}




