main.cpp 2.0 KB

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