main.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include <igl/readOFF.h>
  2. #include <igl/viewer/Viewer.h>
  3. #include <igl/per_vertex_normals.h>
  4. #include <igl/per_face_normals.h>
  5. #include <igl/per_corner_normals.h>
  6. #include <igl/avg_edge_length.h>
  7. #include <igl/principal_curvature.h>
  8. #include <igl/jet.h>
  9. #include <igl/cotmatrix.h>
  10. #include <igl/massmatrix.h>
  11. #include <igl/invert_diag.h>
  12. Eigen::MatrixXd V;
  13. Eigen::MatrixXi F;
  14. int main(int argc, char *argv[])
  15. {
  16. using namespace Eigen;
  17. // Load a mesh in OFF format
  18. igl::readOFF("../shared/fertility.off", V, F);
  19. // Alternative discrete mean curvature
  20. MatrixXd HN;
  21. SparseMatrix<double> L,M,Minv;
  22. igl::cotmatrix(V,F,L);
  23. igl::massmatrix(V,F,igl::MASSMATRIX_TYPE_VORONOI,M);
  24. igl::invert_diag(M,Minv);
  25. // Laplace-Beltrami of position
  26. HN = -Minv*(L*V);
  27. // Extract magnitude as mean curvature
  28. VectorXd H = HN.rowwise().norm();
  29. // Compute curvature directions via quadric fitting
  30. MatrixXd PD1,PD2;
  31. VectorXd PV1,PV2;
  32. igl::principal_curvature(V,F,PD1,PD2,PV1,PV2);
  33. // mean curvature
  34. H = 0.5*(PV1+PV2);
  35. igl::Viewer viewer;
  36. viewer.set_mesh(V, F);
  37. // Compute pseudocolor
  38. MatrixXd C;
  39. igl::jet(H,true,C);
  40. viewer.set_colors(C);
  41. // Average edge length for sizing
  42. const double avg = igl::avg_edge_length(V,F);
  43. // Draw a red segment parallel to the minimal curvature direction
  44. const RowVector3d red(1,0,0),blue(0,0,1);
  45. viewer.add_edges(V + PD1*avg, V - PD1*avg, red);
  46. // Draw a blue segment parallel to the maximal curvature direction
  47. viewer.add_edges(V + PD2*avg, V - PD2*avg, blue);
  48. // Hide wireframe
  49. viewer.options.show_lines = false;
  50. viewer.launch();
  51. }