main.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <igl/readOFF.h>
  2. #include <igl/viewer/Viewer.h>
  3. #include <igl/per_vertex_normals.h>
  4. #include <igl/avg_edge_length.h>
  5. #include <iostream>
  6. #include "igl/lim/compute_lim.h"
  7. using namespace Eigen;
  8. using namespace std;
  9. // Mesh
  10. Eigen::MatrixX3d V0;
  11. Eigen::MatrixX3d V1;
  12. Eigen::MatrixXi F;
  13. SparseMatrix<double> C;
  14. Eigen::VectorXd b;
  15. vector<int> bv; // border vertices (don't need to be defined exept for LSCM)
  16. Eigen::VectorXd g; // gradients (don't need to be defined execpt for Poisson)
  17. // This function is called every time a keyboard button is pressed
  18. // keys: 0:Original Mesh / 1:Harmonic / 2:Biharmonic / 3:Green / 4:ARAP
  19. bool key_down(igl::Viewer& viewer,unsigned char key,int modifier)
  20. {
  21. using namespace std;
  22. using namespace Eigen;
  23. if(key >= '0' && key <= '4')
  24. {
  25. // compute locally injective map
  26. int energy = key - 49;
  27. V1 = V0;
  28. if(energy >= 0)
  29. igl::compute_lim(V1,V0,F,bv,g,C,b,energy,1e-8,100,true);
  30. // set mesh
  31. viewer.set_mesh(V1,F);
  32. }
  33. return false;
  34. }
  35. int main(int argc, char *argv[])
  36. {
  37. using namespace std;
  38. using namespace Eigen;
  39. // load a mesh in OFF format
  40. igl::readOFF("../shared/grid.off",V0,F);
  41. V1 = V0;
  42. // find bottom and left boundary vertices
  43. vector<int> fixedVertices;
  44. for(int i=0;i<V0.rows();i++)
  45. {
  46. if(V0.row(i)[0] == 0 || V0.row(i)[1] == 0)
  47. fixedVertices.push_back(i);
  48. }
  49. // fix boundaries
  50. C.resize(2*fixedVertices.size()+2,V0.rows()*2);
  51. for(int i=0;i<fixedVertices.size();i++)
  52. {
  53. C.insert(2*i,2*fixedVertices[i]) = 1;
  54. C.insert(2*i+1,2*fixedVertices[i]+1) = 1;
  55. }
  56. // constraint targets
  57. b.resize(2*fixedVertices.size()+2);
  58. for(int i=0;i<fixedVertices.size();i++)
  59. {
  60. b(2*i) = V0.row(fixedVertices[i])[0];
  61. b(2*i+1) = V0.row(fixedVertices[i])[1];
  62. }
  63. // drag top left corner vertex to the center
  64. int id = 2;
  65. C.insert(2*fixedVertices.size(),2*id) = 1;
  66. C.insert(2*fixedVertices.size()+1,2*id+1) = 1;
  67. b(2*fixedVertices.size()) = 0.2;
  68. b(2*fixedVertices.size()+1) = 0.2;
  69. // compute locally injective map
  70. igl::compute_lim(V1,V0,F,bv,g,C,b,0,1e-8,100,true);
  71. // Show mesh
  72. igl::Viewer viewer;
  73. viewer.callback_key_down = &key_down;
  74. viewer.set_mesh(V1, F);
  75. viewer.options.show_lines = true;
  76. viewer.options.lighting_factor = 0.0f;
  77. viewer.launch();
  78. }