tetgenio_to_tetmesh.cpp 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #include "tetgenio_to_tetmesh.h"
  2. // IGL includes
  3. #include <igl/list_to_matrix.h>
  4. // STL includes
  5. #include <iostream>
  6. IGL_INLINE bool igl::tetgenio_to_tetmesh(
  7. const tetgenio & out,
  8. std::vector<std::vector<REAL > > & V,
  9. std::vector<std::vector<int> > & T)
  10. {
  11. using namespace std;
  12. // process points
  13. if(out.pointlist == NULL)
  14. {
  15. cerr<<"^tetgenio_to_tetmesh Error: point list is NULL\n"<<endl;
  16. return false;
  17. }
  18. V.resize(out.numberofpoints,vector<REAL>(3));
  19. // loop over points
  20. for(int i = 0;i < out.numberofpoints; i++)
  21. {
  22. V[i][0] = out.pointlist[i*3+0];
  23. V[i][1] = out.pointlist[i*3+1];
  24. V[i][2] = out.pointlist[i*3+2];
  25. }
  26. // process tets
  27. if(out.tetrahedronlist == NULL)
  28. {
  29. cerr<<"^tetgenio_to_tetmesh Error: tet list is NULL\n"<<endl;
  30. return false;
  31. }
  32. // When would this not be 4?
  33. assert(out.numberofcorners == 4);
  34. T.resize(out.numberoftetrahedra,vector<int>(out.numberofcorners));
  35. int min_index = 1e7;
  36. int max_index = -1e7;
  37. // loop over tetrahedra
  38. for(int i = 0; i < out.numberoftetrahedra; i++)
  39. {
  40. for(int j = 0; j<out.numberofcorners; j++)
  41. {
  42. int index = out.tetrahedronlist[i * out.numberofcorners + j];
  43. T[i][j] = index;
  44. min_index = (min_index > index ? index : min_index);
  45. max_index = (max_index < index ? index : max_index);
  46. }
  47. }
  48. assert(min_index >= 0);
  49. assert(max_index >= 0);
  50. assert(max_index < (int)V.size());
  51. return true;
  52. }
  53. template <typename DerivedV, typename DerivedT>
  54. IGL_INLINE bool igl::tetgenio_to_tetmesh(
  55. const tetgenio & out,
  56. Eigen::PlainObjectBase<DerivedV>& V,
  57. Eigen::PlainObjectBase<DerivedT>& T)
  58. {
  59. using namespace igl;
  60. using namespace std;
  61. vector<vector<REAL> > vV;
  62. vector<vector<int> > vT;
  63. bool success = tetgenio_to_tetmesh(out,vV,vT);
  64. if(!success)
  65. {
  66. return false;
  67. }
  68. bool V_rect = list_to_matrix(vV,V);
  69. if(!V_rect)
  70. {
  71. // igl::list_to_matrix(vV,V) already printed error message to std err
  72. return false;
  73. }
  74. bool T_rect = list_to_matrix(vT,T);
  75. if(!T_rect)
  76. {
  77. // igl::list_to_matrix(vT,T) already printed error message to std err
  78. return false;
  79. }
  80. return true;
  81. }
  82. #ifndef IGL_HEADER_ONLY
  83. // Explicit template specialization
  84. template bool igl::tetgenio_to_tetmesh<Eigen::Matrix<double, -1, -1, 0, -1, -1>, Eigen::Matrix<int, -1, -1, 0, -1, -1> >(tetgenio const&, Eigen::PlainObjectBase<Eigen::Matrix<double, -1, -1, 0, -1, -1> >&, Eigen::PlainObjectBase<Eigen::Matrix<int, -1, -1, 0, -1, -1> >&);
  85. #endif