/**============================================================================
 *
 * \file    main.cpp
 * \brief   Main file.
 *
 * \author  Leblanc Christophe
 * \date    06/11/2012
 * \e-mail: cleblancad@gmail.com
 *
 *===========================================================================*/

/*
  Library used:
   1. itk. http://www.itk.org
   2. vtk. http://www.vtk.org
   3. boost. http://www.boost.org
   4. RStarTree. http://www.ics.uci.edu/~salsubai/rstartree.html (included in the code)
   5. voro++. http://math.lbl.gov/voro++ (included in the code)
   6. gmm++. http://download.gna.org/getfem/html/homepage/download.html
   7. OpenMesh. http://www.openmesh.org (included in the code)
   8. CGAL. http://www.cgal.org/
   9. vcglib. http://vcg.isti.cnr.it/vcglib/ (included in the code)
   10. eigenlib. http://eigen.tuxfamily.org/index.php?title=Main_Page (included in the code)
   11. meshlab. http://meshlab.sourceforge.net/ (included in the code)
   12. iris. https://github.com/rdeits/iris-distro (included in the code)
   13. gsl. http://www.gnu.org/software/gsl/
*/

#include "run_phtr.hpp"
//#include "run_phtr2.hpp"
#include "run_bin_foams.hpp"
#include "run_artif.hpp"
//#include "run_artif_dirt.hpp"
//#include "run_artif_noisy_walls.hpp"
//#include "run_artif_salt_pepper_noise.hpp"
//#include "run_artif_radon_noise.hpp"
//#include "run_artif_radon_angle.hpp"
//#include "run_artif_noise.hpp"
//#include "run_imorph.hpp"
//#include "run_imorph_noise.hpp"
//#include "run_vtk.hpp"
//#include "run_mavi.hpp"

/*#include "src/OpenMesh-3.3/src/OpenMesh/Core/IO/MeshIO.hh"
#include "src/filter/detail/discretize/OpenMesh_voro_converter.hpp"
#include "src/filter/detail/discretize/mesh_intersection.hpp"
#include "src/filter/detail/discretize/mesh_intersection_helper.hpp"
#include "src/filter/detail/discretize/mesh_intersection_helper2.hpp"
#include "src/filter/detail/discretize/mesh_intersection_gmsh_adapter.hpp"
#include "src/filter/detail/discretize/mesh_triangulation_center.hpp"
#include "src/filter/detail/discretize/gmsh_writer.hpp"

typedef typename itk::MeshIntersection::MeshType MyMesh;
typedef typename itk::MeshIntersection::MeshContainerType MeshVector;
typedef typename itk::OpenMeshNefCGALConverter::KernelType Kernel;
typedef typename itk::OpenMeshNefCGALConverter::PolyhedronType Nef_polyhedron;*/

int main(int argc, char **argv)
{ 
  /*double thickness = 7.0;
  voro::container_aniso cona(-15., 15., -15., 15., -15.0, 15., 3, 3, 3, false, false, false, 8, thickness);
  cona.import("data_aniso.dat");
  cona.draw_particles("cona_points.gnu");
  cona.draw_cells_gnuplot("cona_cells.gnu");*/
  
  //-------------------------------------------
  
  /*MyMesh mesh, mesh2;
  
  typename MyMesh::VertexHandle vhandle[8];
  vhandle[0] = mesh.add_vertex(typename MyMesh::Point(-2, -2,  2));
  vhandle[1] = mesh.add_vertex(typename MyMesh::Point( 2, -2,  2));
  vhandle[2] = mesh.add_vertex(typename MyMesh::Point( 2,  2,  2));
  vhandle[3] = mesh.add_vertex(typename MyMesh::Point(-2,  2,  2));
  vhandle[4] = mesh.add_vertex(typename MyMesh::Point(-2, -2, -2));
  vhandle[5] = mesh.add_vertex(typename MyMesh::Point( 2, -2, -2));
  vhandle[6] = mesh.add_vertex(typename MyMesh::Point( 2,  2, -2));
  vhandle[7] = mesh.add_vertex(typename MyMesh::Point(-2,  2, -2));
  
  // generate (quadrilateral) faces
  std::vector< typename MyMesh::VertexHandle>  face_vhandles;
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[3]);
  face_vhandles.push_back(vhandle[2]);
  face_vhandles.push_back(vhandle[1]);
  face_vhandles.push_back(vhandle[0]);
  mesh.add_face(face_vhandles);
 
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[4]);
  face_vhandles.push_back(vhandle[5]);
  face_vhandles.push_back(vhandle[6]);
  face_vhandles.push_back(vhandle[7]);
  mesh.add_face(face_vhandles);
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[5]);
  face_vhandles.push_back(vhandle[4]);
  face_vhandles.push_back(vhandle[0]);
  face_vhandles.push_back(vhandle[1]);
  mesh.add_face(face_vhandles);
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[6]);
  face_vhandles.push_back(vhandle[5]);
  face_vhandles.push_back(vhandle[1]);
  face_vhandles.push_back(vhandle[2]);
  mesh.add_face(face_vhandles);
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[6]);
  face_vhandles.push_back(vhandle[2]);
  face_vhandles.push_back(vhandle[3]);
  face_vhandles.push_back(vhandle[7]);
  mesh.add_face(face_vhandles);
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[0]);
  face_vhandles.push_back(vhandle[4]);
  face_vhandles.push_back(vhandle[7]);
  face_vhandles.push_back(vhandle[3]);
  mesh.add_face(face_vhandles);
  
  vhandle[0] = mesh2.add_vertex(typename MyMesh::Point(-2, -2,  1));
  vhandle[1] = mesh2.add_vertex(typename MyMesh::Point( 2, -1,  1));
  vhandle[2] = mesh2.add_vertex(typename MyMesh::Point( 2,  1,  1));
  vhandle[3] = mesh2.add_vertex(typename MyMesh::Point(-2,  1,  1));
  vhandle[4] = mesh2.add_vertex(typename MyMesh::Point(-2, -2, -1));
  vhandle[5] = mesh2.add_vertex(typename MyMesh::Point( 2, -1, -1));
  vhandle[6] = mesh2.add_vertex(typename MyMesh::Point( 2,  1, -1));
  vhandle[7] = mesh2.add_vertex(typename MyMesh::Point(-2,  1, -1));*/
  
  /*vhandle[0] = mesh2.add_vertex(typename MyMesh::Point(-2, -1,  2));
  vhandle[1] = mesh2.add_vertex(typename MyMesh::Point( 1, -1,  2));
  vhandle[2] = mesh2.add_vertex(typename MyMesh::Point( 1,  2,  2));
  vhandle[3] = mesh2.add_vertex(typename MyMesh::Point(-2,  2,  2));
  vhandle[4] = mesh2.add_vertex(typename MyMesh::Point(-2, -1, -1));
  vhandle[5] = mesh2.add_vertex(typename MyMesh::Point( 1, -1, -1));
  vhandle[6] = mesh2.add_vertex(typename MyMesh::Point( 1,  2, -1));
  vhandle[7] = mesh2.add_vertex(typename MyMesh::Point(-2,  2, -1));*/
  
  /*// generate (quadrilateral) faces
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[3]);
  face_vhandles.push_back(vhandle[2]);
  face_vhandles.push_back(vhandle[1]);
  face_vhandles.push_back(vhandle[0]);
  mesh2.add_face(face_vhandles);
 
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[4]);
  face_vhandles.push_back(vhandle[5]);
  face_vhandles.push_back(vhandle[6]);
  face_vhandles.push_back(vhandle[7]);
  mesh2.add_face(face_vhandles);
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[5]);
  face_vhandles.push_back(vhandle[4]);
  face_vhandles.push_back(vhandle[0]);
  face_vhandles.push_back(vhandle[1]);
  mesh2.add_face(face_vhandles);
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[6]);
  face_vhandles.push_back(vhandle[5]);
  face_vhandles.push_back(vhandle[1]);
  face_vhandles.push_back(vhandle[2]);
  mesh2.add_face(face_vhandles);
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[6]);
  face_vhandles.push_back(vhandle[2]);
  face_vhandles.push_back(vhandle[3]);
  face_vhandles.push_back(vhandle[7]);
  mesh2.add_face(face_vhandles);
  face_vhandles.clear();
  face_vhandles.push_back(vhandle[0]);
  face_vhandles.push_back(vhandle[4]);
  face_vhandles.push_back(vhandle[7]);
  face_vhandles.push_back(vhandle[3]);
  mesh2.add_face(face_vhandles);
  
  MeshVector meshVect;
  meshVect.push_back(mesh2);
  
  OpenMesh::IO::write_mesh(mesh2, "test2_or.off");  
  OpenMesh::IO::write_mesh(mesh, "test.off");
  
  // Writes output file for Gmsh.
  itk::GmshWriter writer("test.geo", &mesh, &meshVect , 0.5, 6);
  writer.SetTolerance(1.0e-1);
  writer.SetSmallEdgeTolerance(0.1);
  writer.SetSmallFaceTolerance(0.1);
  writer.Write();
  
  OpenMesh::IO::write_mesh(meshVect.back(), "test2.off");*/
  
  //---------------------------------
  
  run_phtr();
  //run_phtr2();
  //run_bin_foams();
  //run_artif();
  //run_artif_dirt();
  //run_artif_noisy_walls();
  //run_artif_salt_pepper_noise();
  //run_artif_radon_noise();
  //run_artif_radon_angle();
  //run_artif_noise();
  //run_imorph();
  //run_imorph_noise();
  //run_vtk();
  //run_mavi();

  return EXIT_SUCCESS;
}
