#include <igl/viewer/Viewer.h> #include <igl/tetgen/tetrahedralize.h> #include <igl/readOFF.h> #include <igl/barycenter.h> // Input polygon Eigen::MatrixXd V; Eigen::MatrixXi F; Eigen::MatrixXd B; // Tetrahedralized interior Eigen::MatrixXd TV; Eigen::MatrixXi TT; Eigen::MatrixXi TF; // This function is called every time a keyboard button is pressed bool key_down(igl::Viewer& viewer, unsigned char key, int modifier) { using namespace std; using namespace Eigen; if (key >= '1' && key <= '9') { double t = double((key - '1')+1) / 9.0; VectorXd v = B.col(2).array() - B.col(2).minCoeff(); v /= v.col(0).maxCoeff(); vector<int> s; for (unsigned i=0; i<v.size();++i) if (v(i) < t) s.push_back(i); MatrixXd V_temp(s.size()*4,3); MatrixXi F_temp(s.size()*4,3); for (unsigned i=0; i<s.size();++i) { V_temp.row(i*4+0) = TV.row(TT(s[i],0)); V_temp.row(i*4+1) = TV.row(TT(s[i],1)); V_temp.row(i*4+2) = TV.row(TT(s[i],2)); V_temp.row(i*4+3) = TV.row(TT(s[i],3)); F_temp.row(i*4+0) << (i*4)+0, (i*4)+1, (i*4)+3; F_temp.row(i*4+1) << (i*4)+0, (i*4)+2, (i*4)+1; F_temp.row(i*4+2) << (i*4)+3, (i*4)+2, (i*4)+0; F_temp.row(i*4+3) << (i*4)+1, (i*4)+2, (i*4)+3; } viewer.clear(); viewer.set_mesh(V_temp,F_temp); viewer.set_face_based(true); } return false; } int main(int argc, char *argv[]) { using namespace Eigen; using namespace std; // Load a surface mesh igl::readOFF("../shared/fertility.off",V,F); // Tetrahedralize the interior igl::tetrahedralize(V,F,"pq1.414", TV,TT,TF); // Compute barycenters igl::barycenter(TV,TT,B); // Plot the generated mesh igl::Viewer viewer; viewer.callback_key_down = &key_down; key_down(viewer,'5',0); viewer.launch(); }