main.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include <igl/viewer/Viewer.h>
  2. #include <igl/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::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("../shared/fertility.off",V,F);
  52. // Tetrahedralize the interior
  53. igl::tetrahedralize(V,F,"pq1.414Y", TV,TT,TF);
  54. // Compute barycenters
  55. igl::barycenter(TV,TT,B);
  56. // Plot the generated mesh
  57. igl::Viewer viewer;
  58. viewer.callback_key_down = &key_down;
  59. key_down(viewer,'5',0);
  60. viewer.launch();
  61. }