writeMESH.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. #include "writeMESH.h"
  2. #include <cstdio>
  3. #include "verbose.h"
  4. template <typename Scalar, typename Index>
  5. IGL_INLINE bool igl::writeMESH(
  6. const std::string mesh_file_name,
  7. std::vector<std::vector<Scalar > > & V,
  8. std::vector<std::vector<Index > > & T,
  9. std::vector<std::vector<Index > > & F)
  10. {
  11. // not implemented but should be
  12. assert(false);
  13. return false;
  14. }
  15. #include <Eigen/Core>
  16. IGL_INLINE bool igl::writeMESH(
  17. const std::string str,
  18. Eigen::MatrixXd& V,
  19. Eigen::MatrixXi& T,
  20. Eigen::MatrixXi& F)
  21. {
  22. using namespace std;
  23. using namespace igl;
  24. using namespace Eigen;
  25. FILE * mesh_file = fopen(str.c_str(),"w");
  26. if(NULL==mesh_file)
  27. {
  28. fprintf(stderr,"IOError: %s could not be opened...",str.c_str());
  29. return false;
  30. }
  31. // print header
  32. fprintf(mesh_file,"MeshVersionFormatted 1\n");
  33. fprintf(mesh_file,"Dimension 3\n");
  34. // print tet vertices
  35. fprintf(mesh_file,"Vertices\n");
  36. // print number of tet vertices
  37. int number_of_tet_vertices = V.rows();
  38. fprintf(mesh_file,"%d\n",number_of_tet_vertices);
  39. // loop over tet vertices
  40. for(int i = 0;i<number_of_tet_vertices;i++)
  41. {
  42. // print position of ith tet vertex
  43. fprintf(mesh_file,"%lg %lg %lg 1\n",
  44. (double)V(i,0),
  45. (double)V(i,1),
  46. (double)V(i,2));
  47. }
  48. verbose("WARNING: save_mesh() assumes that vertices have"
  49. " same indices in surface as volume...\n");
  50. // print faces
  51. fprintf(mesh_file,"Triangles\n");
  52. // print number of triangles
  53. int number_of_triangles = F.rows();
  54. fprintf(mesh_file,"%d\n",number_of_triangles);
  55. // loop over faces
  56. for(int i = 0;i<number_of_triangles;i++)
  57. {
  58. // loop over vertices in face
  59. fprintf(mesh_file,"%d %d %d 1\n",
  60. (int)F(i,0)+1,
  61. (int)F(i,1)+1,
  62. (int)F(i,2)+1);
  63. }
  64. // print tetrahedra
  65. fprintf(mesh_file,"Tetrahedra\n");
  66. int number_of_tetrahedra = T.rows();
  67. // print number of tetrahedra
  68. fprintf(mesh_file,"%d\n",number_of_tetrahedra);
  69. // loop over tetrahedra
  70. for(int i = 0; i < number_of_tetrahedra;i++)
  71. {
  72. // mesh standard uses 1-based indexing
  73. fprintf(mesh_file, "%d %d %d %d 1\n",
  74. (int)T(i,0)+1,
  75. (int)T(i,1)+1,
  76. (int)T(i,2)+1,
  77. (int)T(i,3)+1);
  78. }
  79. fclose(mesh_file);
  80. return true;
  81. }
  82. #ifndef IGL_HEADER_ONLY
  83. // Explicit template specialization
  84. #endif