main.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <igl/readOFF.h>
  2. #include <igl/matlab/matlabinterface.h>
  3. #include <igl/viewer/Viewer.h>
  4. #include <igl/jet.h>
  5. #include <igl/cotmatrix.h>
  6. // Base mesh
  7. Eigen::MatrixXd V;
  8. Eigen::MatrixXi F;
  9. // Matlab instance
  10. Engine* engine;
  11. // Eigenvectors of the laplacian
  12. Eigen::MatrixXd EV;
  13. void plotEV(igl::Viewer& viewer, int id)
  14. {
  15. Eigen::VectorXd v = EV.col(id);
  16. v = v.array() - v.minCoeff();
  17. v = v.array() / v.maxCoeff();
  18. // Map to colors using jet colorramp
  19. Eigen::MatrixXd C(V.rows(),3);
  20. for (unsigned i=0; i<V.rows(); ++i)
  21. {
  22. double r,g,b;
  23. igl::jet(v(i),r,g,b);
  24. C.row(i) << r,g,b;
  25. }
  26. viewer.set_colors(C);
  27. }
  28. // This function is called every time a keyboard button is pressed
  29. bool key_down(igl::Viewer& viewer, unsigned char key, int modifier)
  30. {
  31. if (key >= '1' && key <= '9')
  32. plotEV(viewer,(key - '1') + 1);
  33. return false;
  34. }
  35. int main(int argc, char *argv[])
  36. {
  37. // Load a mesh in OFF format
  38. igl::readOFF("../shared/3holes.off", V, F);
  39. // Launch MATLAB
  40. igl::mlinit(&engine);
  41. // Compute the discrete Laplacian operator
  42. Eigen::SparseMatrix<double> L;
  43. igl::cotmatrix(V,F,L);
  44. // Send Laplacian matrix to matlab
  45. igl::mlsetmatrix(&engine,"L",L);
  46. // Plot the laplacian matrix using matlab spy
  47. igl::mleval(&engine,"spy(L)");
  48. // Extract the first 10 eigenvectors
  49. igl::mleval(&engine,"[EV,~] = eigs(-L,10,'sm')");
  50. // Plot the size of EV (only for demostration purposes)
  51. std::cerr << igl::mleval(&engine,"size(EV)") << std::endl;
  52. // Retrieve the result
  53. igl::mlgetmatrix(&engine,"EV",EV);
  54. // Plot the mesh
  55. igl::Viewer viewer;
  56. viewer.callback_key_down = &key_down;
  57. viewer.set_mesh(V, F);
  58. // Plot the first non-trivial eigenvector
  59. plotEV(viewer,1);
  60. // Launch the viewer
  61. viewer.launch();
  62. }