#include #include #include #include #include #include "igl/lim/compute_lim.h" using namespace Eigen; using namespace std; // Mesh Eigen::MatrixX3d V0; Eigen::MatrixX3d V1; Eigen::MatrixXi F; SparseMatrix C; Eigen::VectorXd b; int 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,unsigned char key,int modifier) { using namespace std; using namespace Eigen; if(key >= '0' && key <= '5' || key == 'B') { // compute locally injective map int energy = key - '1'; V1 = V0; if(key == 'B') { barriersEnabled = !barriersEnabled; } else { if(energy >= 0) energyType = energy; } if(key != '0') igl::compute_lim(V1,V0,F,C,b,energyType,1e-8,100,true,true,barriersEnabled,true,-1,-1); // set mesh viewer.set_vertices(V1); return true; } return false; } int main(int argc, char *argv[]) { using namespace std; using namespace Eigen; energyType = 0; barriersEnabled = true; // load a mesh in OFF format igl::readOFF("../shared/grid.off",V0,F); V1 = V0; // find bottom and left boundary vertices vector fixedVertices; for(int i=0;i