check_mesh_for_issues.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #include "check_mesh_for_issues.h"
  2. #include <iostream>
  3. #include <igl/doublearea.h>
  4. #include <igl/vertex_components.h>
  5. #include <igl/euler_characteristic.h>
  6. #include <igl/is_edge_manifold.h>
  7. #include <igl/adjacency_matrix.h>
  8. #include <Eigen/Sparse>
  9. void check_mesh_for_issues(Eigen::MatrixXd& V, Eigen::MatrixXi& F) {
  10. using namespace std;
  11. Eigen::SparseMatrix<double> A;
  12. igl::adjacency_matrix(F,A);
  13. Eigen::MatrixXi C, Ci;
  14. igl::vertex_components(A, C, Ci);
  15. int connected_components = Ci.rows();
  16. if (connected_components!=1) {
  17. cout << "Error! Input has multiple connected components" << endl; exit(1);
  18. }
  19. int euler_char = igl::euler_characteristic(F);
  20. if (euler_char!=1)
  21. {
  22. cout <<
  23. "Error! Input does not have a disk topology, it's euler char is " <<
  24. euler_char << endl;
  25. exit(1);
  26. }
  27. bool is_edge_manifold = igl::is_edge_manifold(F);
  28. if (!is_edge_manifold) {
  29. cout << "Error! Input is not an edge manifold" << endl; exit(1);
  30. }
  31. Eigen::VectorXd areas; igl::doublearea(V,F,areas);
  32. const double eps = 1e-14;
  33. for (int i = 0; i < areas.rows(); i++) {
  34. if (areas(i) < eps) {
  35. cout << "Error! Input has zero area faces" << endl; exit(1);
  36. }
  37. }
  38. }