1 // This file is part of libigl, a simple c++ geometry processing library.
2 //
3 // Copyright (C) 2013 Alec Jacobson <alecjacobson@gmail.com>
4 //
5 // This Source Code Form is subject to the terms of the Mozilla Public License
6 // v. 2.0. If a copy of the MPL was not distributed with this file, You can
7 // obtain one at http://mozilla.org/MPL/2.0/.
8 #include "mesh_to_tetgenio.h"
9 
10 // IGL includes
11 #include "../../matrix_to_list.h"
12 
13 // STL includes
14 #include <cassert>
15 
mesh_to_tetgenio(const std::vector<std::vector<REAL>> & V,const std::vector<std::vector<int>> & F,tetgenio & in)16 IGL_INLINE bool igl::copyleft::tetgen::mesh_to_tetgenio(
17   const std::vector<std::vector<REAL > > & V,
18   const std::vector<std::vector<int> > & F,
19   tetgenio & in)
20 {
21   using namespace std;
22   // all indices start from 0
23   in.firstnumber = 0;
24 
25   in.numberofpoints = V.size();
26   in.pointlist = new REAL[in.numberofpoints * 3];
27   // loop over points
28   for(int i = 0; i < (int)V.size(); i++)
29   {
30     assert(V[i].size() == 3);
31     in.pointlist[i*3+0] = V[i][0];
32     in.pointlist[i*3+1] = V[i][1];
33     in.pointlist[i*3+2] = V[i][2];
34   }
35 
36   in.numberoffacets = F.size();
37   in.facetlist = new tetgenio::facet[in.numberoffacets];
38   in.facetmarkerlist = new int[in.numberoffacets];
39 
40   // loop over face
41   for(int i = 0;i < (int)F.size(); i++)
42   {
43     in.facetmarkerlist[i] = i;
44     tetgenio::facet * f = &in.facetlist[i];
45     f->numberofpolygons = 1;
46     f->polygonlist = new tetgenio::polygon[f->numberofpolygons];
47     f->numberofholes = 0;
48     f->holelist = NULL;
49     tetgenio::polygon * p = &f->polygonlist[0];
50     p->numberofvertices = F[i].size();
51     p->vertexlist = new int[p->numberofvertices];
52     // loop around face
53     for(int j = 0;j < (int)F[i].size(); j++)
54     {
55       p->vertexlist[j] = F[i][j];
56     }
57   }
58   return true;
59 }
60 
61 template <typename DerivedV, typename DerivedF>
mesh_to_tetgenio(const Eigen::PlainObjectBase<DerivedV> & V,const Eigen::PlainObjectBase<DerivedF> & F,tetgenio & in)62 IGL_INLINE bool igl::copyleft::tetgen::mesh_to_tetgenio(
63   const Eigen::PlainObjectBase<DerivedV>& V,
64   const Eigen::PlainObjectBase<DerivedF>& F,
65   tetgenio & in)
66 {
67   using namespace std;
68   vector<vector<REAL> > vV;
69   vector<vector<int> > vF;
70   matrix_to_list(V,vV);
71   matrix_to_list(F,vF);
72   return mesh_to_tetgenio(vV,vF,in);
73 }
74 
75 #ifdef IGL_STATIC_LIBRARY
76 // Explicit template instantiation
77 template bool igl::copyleft::tetgen::mesh_to_tetgenio<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> > const&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> > const&, tetgenio&);
78 #endif
79