main.cpp 1.8 KB

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