main.cpp 2.0 KB

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