main.cpp 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #include <igl/avg_edge_length.h>
  2. #include <igl/barycenter.h>
  3. #include <igl/grad.h>
  4. #include <igl/jet.h>
  5. #include <igl/readDMAT.h>
  6. #include <igl/readOFF.h>
  7. #include <igl/opengl/glfw/Viewer.h>
  8. #include <iostream>
  9. #include "tutorial_shared_path.h"
  10. int main(int argc, char *argv[])
  11. {
  12. using namespace Eigen;
  13. using namespace std;
  14. MatrixXd V;
  15. MatrixXi F;
  16. // Load a mesh in OFF format
  17. igl::readOFF(TUTORIAL_SHARED_PATH "/cheburashka.off", V, F);
  18. // Read scalar function values from a file, U: #V by 1
  19. VectorXd U;
  20. igl::readDMAT(TUTORIAL_SHARED_PATH "/cheburashka-scalar.dmat",U);
  21. // Compute gradient operator: #F*3 by #V
  22. SparseMatrix<double> G;
  23. igl::grad(V,F,G);
  24. // Compute gradient of U
  25. MatrixXd GU = Map<const MatrixXd>((G*U).eval().data(),F.rows(),3);
  26. // Compute gradient magnitude
  27. const VectorXd GU_mag = GU.rowwise().norm();
  28. igl::opengl::glfw::Viewer viewer;
  29. viewer.data().set_mesh(V, F);
  30. viewer.data().set_data(U);
  31. // Average edge length divided by average gradient (for scaling)
  32. const double max_size = igl::avg_edge_length(V,F) / GU_mag.mean();
  33. // Draw a black segment in direction of gradient at face barycenters
  34. MatrixXd BC;
  35. igl::barycenter(V,F,BC);
  36. const RowVector3d black(0,0,0);
  37. viewer.data().add_edges(BC,BC+max_size*GU, black);
  38. // Hide wireframe
  39. viewer.data().show_lines = false;
  40. viewer.launch();
  41. }