main.cpp 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <igl/opengl/glfw/Viewer.h>
  2. #include <igl/copyleft/tetgen/tetrahedralize.h>
  3. #include <igl/readOFF.h>
  4. #include <igl/barycenter.h>
  5. // Input polygon
  6. Eigen::MatrixXd V;
  7. Eigen::MatrixXi F;
  8. Eigen::MatrixXd B;
  9. // Tetrahedralized interior
  10. Eigen::MatrixXd TV;
  11. Eigen::MatrixXi TT;
  12. Eigen::MatrixXi TF;
  13. // This function is called every time a keyboard button is pressed
  14. bool key_down(igl::opengl::glfw::Viewer& viewer, unsigned char key, int modifier)
  15. {
  16. using namespace std;
  17. using namespace Eigen;
  18. if (key >= '1' && key <= '9')
  19. {
  20. double t = double((key - '1')+1) / 9.0;
  21. VectorXd v = B.col(2).array() - B.col(2).minCoeff();
  22. v /= v.col(0).maxCoeff();
  23. vector<int> s;
  24. for (unsigned i=0; i<v.size();++i)
  25. if (v(i) < t)
  26. s.push_back(i);
  27. MatrixXd V_temp(s.size()*4,3);
  28. MatrixXi F_temp(s.size()*4,3);
  29. for (unsigned i=0; i<s.size();++i)
  30. {
  31. V_temp.row(i*4+0) = TV.row(TT(s[i],0));
  32. V_temp.row(i*4+1) = TV.row(TT(s[i],1));
  33. V_temp.row(i*4+2) = TV.row(TT(s[i],2));
  34. V_temp.row(i*4+3) = TV.row(TT(s[i],3));
  35. F_temp.row(i*4+0) << (i*4)+0, (i*4)+1, (i*4)+3;
  36. F_temp.row(i*4+1) << (i*4)+0, (i*4)+2, (i*4)+1;
  37. F_temp.row(i*4+2) << (i*4)+3, (i*4)+2, (i*4)+0;
  38. F_temp.row(i*4+3) << (i*4)+1, (i*4)+2, (i*4)+3;
  39. }
  40. viewer.data().clear();
  41. viewer.data().set_mesh(V_temp,F_temp);
  42. viewer.data().set_face_based(true);
  43. }
  44. return false;
  45. }
  46. int main(int argc, char *argv[])
  47. {
  48. using namespace Eigen;
  49. using namespace std;
  50. // Load a surface mesh
  51. igl::readOFF(TUTORIAL_SHARED_PATH "/fertility.off",V,F);
  52. // Tetrahedralize the interior
  53. igl::copyleft::tetgen::tetrahedralize(V,F,"pq1.414Y", TV,TT,TF);
  54. // Compute barycenters
  55. igl::barycenter(TV,TT,B);
  56. // Plot the generated mesh
  57. igl::opengl::glfw::Viewer viewer;
  58. viewer.callback_key_down = &key_down;
  59. key_down(viewer,'5',0);
  60. viewer.launch();
  61. }