#include #include #include #include #include #include #include "tutorial_shared_path.h" using namespace igl::lim; // Mesh Eigen::MatrixX3d V0; Eigen::MatrixX3d V1; Eigen::MatrixXi F; Eigen::SparseMatrix C; Eigen::VectorXd b; Energy energyType; bool barriersEnabled; // This function is called every time a keyboard button is pressed // keys: 0:Original Mesh / 1:Harmonic / 2:Biharmonic / 3:Green / 4:ARAP bool key_down(igl::viewer::Viewer& viewer,unsigned char key,int modifier) { using namespace std; using namespace Eigen; if(key >= '0' && key <= '5' || key == 'B') { // compute locally injective map Energy energy = Energy(key - '1'); V1 = V0; if(key == 'B') { barriersEnabled = !barriersEnabled; } else { if(energy >= 0) energyType = energy; } if(key != '0') { lim(V1,V0,F,C,b,energyType,1e-8,100,true,true,barriersEnabled,true,-1,-1); } // set mesh viewer.data.set_vertices(V1); return true; } return false; } int main(int argc, char *argv[]) { using namespace std; using namespace Eigen; energyType = Dirichlet; barriersEnabled = true; // load a mesh in OFF format igl::readOFF(TUTORIAL_SHARED_PATH "/grid.off",V0,F); V1 = V0; // find bottom and left boundary vertices vector fixedVertices; for(int i=0;i