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