main.cpp 1.5 KB

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